通过事件处理程序更改React状态

Dha*_*osh 1 javascript jquery reactjs

我的问题是:

如何使用多个选择更改默认设置对象的状态?

下面让我们说,我有状态checkDevicecheckCountry,所以在下面拨弄我设置的所有值false.

我想设置仅true在多选下拉列表中选择的属性的值.

例如:在多选,如果我只是选择USUK然后在我的状态是有办法得到的东西,如:

checkCountry: 
     {
        'US': true,
        'UK': true,
        'JP': false
      }
Run Code Online (Sandbox Code Playgroud)

class Box extends React.Component {

  constructor() {
    super();
    this.state = {
      checkDevice: {
        'iPhone 4': false,
        'iPhone 5': false,
        'iPhone 6': false,
        'iPhone 7': false,
        'iPhone 8': false,
        'iPhone X': false,
      },
      checkCountry: {
        'US': false,
        'UK': false,
        'JP': false
      }
    }
  }

  componentDidMount() {
    $(document).ready(function() {
      $('#country').material_select();
    });
    $(document).ready(function() {
      $('#device').material_select();
    });
  }

  render() {
    return ( 
    <div className="card" style={{width:900,margin: 'auto'}}>
        <form className="row">
          <div className='col s6'>
            <div className="input-field">
              <select value="" multiple id="country">
                <option value="" disabled selected>Choose your option</option>
                <option value="1">US</option>
                <option value="2">UK</option>
                <option value="3">JP</option>
              </select>
              <label>Country</label>
            </div>
          </div>
          <div className='col s6'>
            <div className="input-field">
              <select value="" multiple id="device">
                <option value="" disabled selected>Choose your option</option>
                <option value="1">iPhone 4</option>
                <option value="2">iPhone 5</option>
                <option value="3">iPhone 6</option>
                <option value="4">iPhone 7</option>
                <option value="5">iPhone 8</option>
                <option value="6">iPhone X</option>
              </select>
              <label>Devices</label>
            </div>
          </div>
        </form>
        <div className="row">
        <div className="col s6">
          <pre>{JSON.stringify(this.state.checkCountry,null,2)}</pre>
        </div>
        <div className="col s6">
          <pre>{JSON.stringify(this.state.checkDevice,null,2)}</pre>
        </div>
        </div>
       </div>
    );
  };
}

ReactDOM.render( < Box / > , document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.0/css/materialize.min.css" rel="stylesheet" />
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
<div id='root'></div>
Run Code Online (Sandbox Code Playgroud)

CODEPEN,这将给你更多的自由玩耍.

更新:

React的官方文档中,我们可以看到如何更改完整状态,但是有没有办法只更改现有值的属性

例如 ::

handleChange(event){
    this.setState({checkCountry["event.target.value"] === true ? false: true});
} 
Run Code Online (Sandbox Code Playgroud)

但我不认为,我可以这样做.但我正在尝试这样的事情.

回答可能有用的问题: 使用setstate在react中更新对象

Jos*_*Lin 5

  1. materializecss不会触发反应onChange,所以你必须绑定componentDidMount

  2. valueselect是由react控制的(virtual dom记得吗?),所以你必须指定当前值才能选择

在哪里我改变了你的代码

class Box extends React.Component {
  componentDidMount() {

    //binding onchange
    $(this.countrySelect)
      .on("change", () => {
        let checkCountry = {
          US: false,
          UK: false,
          JP: false
        };
        let val = $(this.countrySelect).val();
        console.log(val);
        val.forEach(x => {
          checkCountry[x] = true;
        });
        this.setState({
          checkCountry
        });
      })
      .material_select();
  }

  render() {
    const { checkCountry } = this.state;
    const countryVal = Object.keys(checkCountry).filter(x => checkCountry[x]);
     //assigin value
    return (<select 
      ref={countrySelect => (this.countrySelect = countrySelect)}
      value={countryVal}
    />)
  }
}
Run Code Online (Sandbox Code Playgroud)

请参阅codepen https://codepen.io/postor/pen/wPLyNq?editors=1011了解结果

在你知道如何自己做之后.我建议你参考这个https://github.com/react-materialize/react-materialize,这可能会节省你一些时间