首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个复选框过滤反应状态

多个复选框过滤反应状态
EN

Stack Overflow用户
提问于 2019-01-30 07:51:44
回答 2查看 7.2K关注 0票数 2

我试图使用多个复选框过滤状态。

我让它在某种程度上起作用,因为你可以检查一种类型来过滤那些类型的电影。

在未选中复选框后,我很难“恢复状态”,同时也允许选择多个筛选器。

我尝试过使用json.stringify克隆原始状态,并按照其他堆栈溢出问题中的建议,克隆原始状态,但这似乎对我不起作用,有些人说,这是一种将其全部结合在一起的糟糕方法。

我在这里创建了应用程序当前状态的堆栈闪现:

https://stackblitz.com/edit/react-9t8f6e

如果有人能给我指明正确的方向,我将非常感激。即使它只是一个链接到一个体面的文章或教程,这将是超级有用的。这个社区最近拯救了我的屁股学习这些东西!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-30 09:47:50

你可以选择先前的答案,也可以像下面这样做:

第一个选项:将所有数据保持在moviesdefaultData状态两种状态

对于筛选和删除/取消使用movies和恢复回所有电影使用defaultData

在您的示例中,使用componentWillMount获取数据,而不是使用componentDidMount。

代码语言:javascript
复制
// Fire API on init
componentDidMount() {
    // Fetch Genre Data
    axios.get(`${base_url}genre/movie/list?api_key=${api_key}`)
        .then(res => this.setState({ genres: res.data.genres }));

    // Fetch 'Now Playing' Data
    axios.get(`${base_url}movie/now_playing?api_key=${api_key}&language=en-US&page=1`)
        .then(res => this.setState({
            movies: res.data.results, // for filter/remove
            isLoaded: true,
            defaultData: res.data.results //this will store default data
        }));
}

第二种选择:

您可以为数据服务创建一个单独的文件,并在需要时重用它,比如还原、撤消。

GetData.js

代码语言:javascript
复制
 import axios from 'axios';

// TMDB Info/Credentials
const base_url = "https://api.themoviedb.org/3/";
const api_key = "39b616a19667f17d8ffcaa175fc93491";


export function data() {
   return axios.get(`${base_url}movie/now_playing?api_key=${api_key}&language=en-US&page=1`)
       .then(res => res.data) 
}

在App.js中

代码语言:javascript
复制
import {data} from './components/GetData';

data().then(data=>{ 
        this.setState({
          movies: data.results,
          isLoaded: true,
        });
    });

演示了这个这里

票数 3
EN

Stack Overflow用户

发布于 2019-01-30 08:04:47

我会这么做的。首先,一些重要的概念:

  1. 更新状态或道具将导致呈现。
  2. filter将创建一个新数组。

这意味着您可以有一个方法来动态计算过滤后的数组:

代码语言:javascript
复制
filteredMovies = () => 
    this.state.movies.filter(movie =>
        this.state.selectedGenres.every(genreId =>
            movie.genre_ids.includes(genreId)
        )
    );

您可以在render方法中使用此方法:

代码语言:javascript
复制
<NowPlaying movies={this.filteredMovies()} />

该方法将在每次呈现时调用,每次更新state.selectedGenres时都会触发该方法。

现在缺少的部分是如何更新state.selectedGenres,但我认为您将管理这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54435643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档