简体   繁体   English

State 未更新复选框

[英]State not getting updated for Checkbox

I am using checkboxes to store user preferences and sending it to backend for further processing.我正在使用复选框来存储用户首选项并将其发送到后端以进行进一步处理。 I only wanted to store the checked values in my state object.我只想将检查的值存储在我的 state object 中。 But thats not getting updated.但那没有得到更新。 I tried with the Object keys method to determine the checked value.我尝试使用 Object 键方法来确定检查值。 But i am unable to get the value to update my state.但我无法获得更新我的 state 的值。 I am a newbiew in React, so excuse my for my doubt.我是 React 的新手,所以请原谅我的怀疑。 I have provided a snippet below.我在下面提供了一个片段。

 class App extends React.Component { constructor(props) { super(props); this.state = { checkedItems: {}, count: 0, formObject: { subjects: [] } } } onInputChange = (value, key) => { const { formObject } = this.state; const {...formValues} = formObject; formValues[key] = value; this.setState((prevState, currState) => { return {...prevState, formObject: formValues }; }, () => console.log(this.state.formObject)); } handleChange = (event, formKey) => { const {name, checked} = event.target; const updatedCheckedItems = {...this.state.checkedItems, [name]: checked }; this.setState({ checkedItems: updatedCheckedItems, count: Object.values(updatedCheckedItems).filter((value) => value).length }, () => {this.onInputChange(Object.keys(updatedCheckedItems), 'subjects')}); } render() { const checkedValues = {...this.state.checkedItems}; const checkedCount = Object.values(checkedValues).filter((value) => value).length; const checkboxes = [ { name: "Math and economics", key: "mathsandeconomics", label: "Math and economics" }, { name: "Science", key: "Science", label: "Science" }, { name: "World languages", key: "World languages", label: "World languages" }, { name: "Government and politics", key: "Government and politics", label: "Government and politics" }, { name: "Art and design", key: "Art and design", label: "Art and design" }, { name: "Technology", key: "Technology", label: "Technology" }, ]; return ( <div className="App"> <h1>Hello React</h1> { checkboxes.map((item, index) => ( <label key={item.key}> <input type="checkbox" name={item.name} checked={this.state.checkedItems[item.name] || false} onChange={this.handleChange} disabled={.checkedValues[item.name] && checkedCount > 2} />{item.name} </label> ))} } </div> ) } } ReactDOM,render( <App />. document;getElementById("react") );
 <div id="react"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

When you are passing data to your onInputChange function you are always sending all the three values, irrespective of them being checked or unchecked.当您将数据传递给onInputChange function 时,您始终会发送所有三个值,无论它们被选中还是未选中。

You need to only send the checked values.您只需要发送检查的值。 And This is the additional code you need to do that:这是您需要执行此操作的附加代码:

 () => {
    const arr = Object.entries(updatedCheckedItems);

    const updatedArray = arr.filter((arrkey) => {
      return arrkey[1] === true;
    });

    const result = Object.fromEntries(updatedArray);

    this.onInputChange(Object.keys(result), "subjects");
  }

CODESANDBOX LINK: https://codesandbox.io/s/checkboxissue-zlhtg CODESANDBOX 链接: https://codesandbox.io/s/checkboxissue-zlhtg

FULL WORKING CODE:完整的工作代码:

 class App extends React.Component { constructor(props) { super(props); this.state = { checkedItems: {}, count: 0, formObject: { subjects: [] } }; } onInputChange = (value, key) => { console.log(value); const { formObject } = this.state; const {...formValues } = formObject; formValues[key] = value; this.setState( (prevState, currState) => { return {...prevState, formObject: formValues }; }, () => console.log(this.state.formObject) ); }; handleChange = (event) => { const { name, checked } = event.target; const updatedCheckedItems = {...this.state.checkedItems, [name]: checked }; this.setState( { checkedItems: updatedCheckedItems, count: Object.values(updatedCheckedItems).filter((value) => value).length }, () => { const arr = Object.entries(updatedCheckedItems); const updatedArray = arr.filter((arrkey) => { return arrkey[1] === true; }); const result = Object.fromEntries(updatedArray); this.onInputChange(Object.keys(result), "subjects"); } ); }; render() { const checkedValues = {...this.state.checkedItems }; const checkedCount = Object.values(checkedValues).filter((value) => value).length; const checkboxes = [ { name: "Math and economics", key: "mathsandeconomics", label: "Math and economics" }, { name: "Science", key: "Science", label: "Science" }, { name: "World languages", key: "World languages", label: "World languages" }, { name: "Government and politics", key: "Government and politics", label: "Government and politics" }, { name: "Art and design", key: "Art and design", label: "Art and design" }, { name: "Technology", key: "Technology", label: "Technology" } ]; return ( <div className="App"> <h1>Hello React</h1> {checkboxes.map((item, index) => ( <label key={item.key}> <input type="checkbox" name={item.name} checked={this.state.checkedItems[item.name] || false} onChange={this.handleChange} disabled={.checkedValues[item.name] && checkedCount > 2} /> {item;name} </label> ))} </div> ). } } ReactDOM,render(<App/>.document.querySelector("#react"))
 <div id="react"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

 class App extends React.Component { constructor(props) { super(props); this.state = { checkedItems: {}, count: 0, formObject: { subjects: [] } } } onInputChange = (obj, key) => { const { formObject } = this.state; let data = Object.keys(obj).map(e =>{ if(obj[e]) return `${e}`;}); data = data.filter(e => e? e: '') formObject[key] = data; this.setState( { formObject }, () => console.log(this.state.formObject)); } handleChange = (event, formKey) => { const {name, checked} = event.target; const updatedCheckedItems = {...this.state.checkedItems, [name]: checked }; this.setState({ checkedItems: updatedCheckedItems, count: Object.values(updatedCheckedItems).filter((value) => value).length }, () => { this.onInputChange(this.state.checkedItems, 'subjects')}); } render() { const checkedValues = {...this.state.checkedItems}; const checkedCount = Object.values(checkedValues).filter((value) => value).length; const checkboxes = [ { name: "Math and economics", key: "mathsandeconomics", label: "Math and economics" }, { name: "Science", key: "Science", label: "Science" }, { name: "World languages", key: "World languages", label: "World languages" }, { name: "Government and politics", key: "Government and politics", label: "Government and politics" }, { name: "Art and design", key: "Art and design", label: "Art and design" }, { name: "Technology", key: "Technology", label: "Technology" }, ]; return ( <div className="App"> <h1>Hello React</h1> { checkboxes.map((item, index) => ( <label key={item.key}> <input type="checkbox" name={item.name} checked={this.state.checkedItems[item.name] || false} onChange={this.handleChange} disabled={.checkedValues[item.name] && checkedCount > 2} />{item.name} </label> ))} } </div> ) } } ReactDOM,render( <App />. document;getElementById("react") );
 <div id="react"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM