代码之家  ›  专栏  ›  技术社区  ›  Hamed Minaee

Select in React不反映状态更改

  •  0
  • Hamed Minaee  · 技术社区  · 7 年前

    当我尝试在ReactJS中选择时,会发生一些奇怪的事情。 这是我的代码:

    onDropDownChange=(e)=>{
        let val = this.props.contactUsReducer.contactUsList.filter(function(item) {
            return item.topic == e.target.value
        });
        let key= e.target.value;
        let name= e.target.name;
        console.log("key "+key+"  val: "+val[0].displayName+" name:"+name);
        this.setState(prevState => {
            return ( {...prevState, [name]:key, displayName: val[0].displayName})
        }, function () {
            console.log(this.state);
        });
    }
    

    在我看来,我有

    <select type="select" className="text-input flex-row-right-item" onChange={this.onDropDownChange} name="topic" value={this.state.displayName}>
      {this.createSelectItems(this.props.contactUsReducer.contactUsList)}
    </select>
    

    还有我的助手功能:

    createSelectItems=(itemsList)=> {
        let items = [];
    
        for (let i = 0; i < itemsList.length; i++) {
                items.push(<option key={itemsList[i].topic} value={itemsList[i].topic}>{itemsList[i].displayName}</option>);
    
        }
        return items;
    }
    

    现在,当我尝试更改选择框时,用户界面中的任何内容都不会更改,因此选择框不会显示更新的选择,但我清楚地看到状态已更新。为什么更改没有反映在选择框中。

    知道吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Rohith Murali    7 年前

    将值设置为 setState 作为,

    this.setState(prevState => {
            return ( {...prevState, [name]:key, displayName: key})
        }, function () {
            console.log(this.state);
        });
    

    因为 value prop应具有所选的值 option

        2
  •  3
  •   njorombe_sn    7 年前

    出于某种原因,您向setstate函数提供了一个函数。我个人发现,制作一份州的副本,并将财产设置得更好。

    onDropDownChange = e => {
      let val = this.state.myArr.filter(function(item) {
        return item.topic === e.target.value;
      });
      let key = e.target.value;
      let name = e.target.name;
      console.log(
      "key " + key + "  val: " + val[0].displayName + " name:" + name
      );
    
      let prevState = { ...this.state };
      prevState[name] = key;
      prevState["displayName"] = val[0].displayName;
    
      this.setState({ ...this.state, prevState });
      console.log(this.state);
    };
    
        3
  •  1
  •   Lafi    7 年前

    select上的值应该是选项标记上的值之一,但是作为这些选项上的值,您要映射 话题 但你做到了 value={this.state.displayName} 在选择标签上? 如果你把它换成 value={this.state.topic} 它将工作,因为它使用相同的数据映射。 这是一个 codesandbox 有效期