Dha*_*osh 1 javascript jquery reactjs
我的问题是:
如何使用多个选择更改默认设置对象的状态?
下面让我们说,我有状态checkDevice和checkCountry,所以在下面拨弄我设置的所有值false.
我想设置仅true在多选下拉列表中选择的属性的值.
例如:在多选,如果我只是选择US和UK然后在我的状态是有办法得到的东西,如:
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中更新对象
materializecss不会触发反应onChange,所以你必须绑定componentDidMount
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,这可能会节省你一些时间