【问题标题】:ReactJS Set state from json data inner array - Multiple ArraysReactJS从json数据内部数组设置状态 - 多个数组
【发布时间】:2016-02-16 22:14:30
【问题描述】:

我有一个 json 文件,它是一个数组,它存储另一个字段,其中包含我想要的另一个数组。我有一个 ajax 请求,将 pitching 字段存储到状态数组 pitchers 我有两个按钮,单击它们时将传递一个等于 json 文件中的 team_flag 属性的值。

<button className="btn" onClick={this.handleClick.bind(this, 'home')}>{homeTeamName}</button>
<button className="btn" onClick={this.handleClick.bind(this, 'away')}>{awayTeamName}</button> 

以及方法:

handleClick: function(teamFlag) {
    // setState of pitchers to whichever team is clicked (home, away)
    // this.setState({ pitchers: this.state.pitchers.teamFlag})???
    console.log(teamFlag);
}

如何设置pitchers 状态,以便它采用与单击的team_flag 对应的pitcher 数组? (即,如果我单击 homeTeam,它将存储 pitcher 数组,该数组位于 "team_flag": "home" 下)下面是 json 文件

     "pitching":[
        {
           "pitcher":[
              {"name": "Billy", "hand": "right"}
           ],
           "team_flag":"away",
        },
        {
           "pitcher":[
              {"name": "Joe", "hand": "right"}
           ],
           "team_flag":"home",
        }
     ],

【问题讨论】:

    标签: javascript arrays json reactjs


    【解决方案1】:

    假设您在pitching 键下的状态下拥有整个“投球”数组,您可以这样:

    var pitchers = this.state.pitching.find(function(team) {
      return team.team_flag === teamFlag;
    });
    
    this.setState({ pitchers: pitchers.pitcher });
    

    如果仅用于演示目的,我不会将结果保存在 state 中,而是保存 teamFlag 并在 render 方法中调用提到的代码。

    React 足够聪明,知道如果 teamFlag 或投球数组发生变化,那么它需要重新渲染。

    编辑:

    class YourComponent extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                loading: true
            }
        }
    
        componentWillMount() {
            // make your ajax request
            // and when the request is finished
            this.setState({ loading: true });
        }
    
        handleClick(ev, flag) {
            this.setState({ flag: flag });
        }
    
        render() {
            let homeTeamName = 'Home';
            let awayTeamName = 'Away';
            let selectedFlag = this.state.flag;
            let pitchers = this.state.pitching.find(function(team) {
                return team.team_flag === selectedFlag;
            });
            return (
                <div>
                    {!this.state.loading ? 
                      <div>
                        <button className="btn" onClick={this.handleClick.bind(this, 'home')}>{homeTeamName}</button>
                        <button className="btn" onClick={this.handleClick.bind(this, 'away')}>{awayTeamName}</button> 
                      </div>:
                      null
                    }
                    // render using the pitchers array
                </div>
            );
        }
    };
    

    【讨论】:

    • 它仅用于演示目的(即我需要获取pitcher 中的数据并在其中显示数据)。如果上面的代码没有进入handleClick方法,它怎么知道什么时候被点击?
    • 我的错,我没有正确表达自己。我们的想法是将标志保存在handleClick 内的状态中,而不是保存投手。我将使用示例组件更新我的答案...
    • 谢谢@nbermudezs,只是想知道什么会改变加载状态,因为它一直都是真的?
    • 糟糕,错字,this.setState({ loading: true }); 应该是 false。对于那个很抱歉。注意它说:“当请求完成时”
    • 嗯,当我尝试您发布的上述方法时,我在构建它时收到错误消息:Adjacent JSX elements must be wrapped in an enclosing tag div 是封闭的...
    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 2016-03-26
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多