代码之家  ›  专栏  ›  技术社区  ›  yevg

reactjs-checkbox onchange事件未触发

  •  2
  • yevg  · 技术社区  · 6 年前

    我正试图在react中实现一组由对象呈现的复选框组成的字段,如下所示:

    constructor() {
    
        this.state.todo = {
            eat: true,
            sleep: false,
            react: true
        }
    
        this.toggleCheckbox = this.toggleCheckbox.bind(this);
    }
    
    toggleCheckbox(e){
    
        console.log(e); // nothing :-/
    }
    
    render() {
    
        return (
        <div>
        { Object.keys(this.state.todo).map((val, i) => (          
            <div key={i} >
                <input 
                    type="checkbox" 
                    value={val} 
                    onChange={this.toggleCheckbox} 
                    checked={this.state.todo[val]} 
                    /><label>{val}</label>
            </div>
         ))}
         </div>
        )
    }
    

    所有渲染都正确,但我无法更改任何复选框。控制台记录 toggleCheck() 事件未被触发。

    我试过用 onClick VS onChange 没有效果。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tholle    6 年前

    你正在从 this.state.tables ,但你的州被称为 this.state.todo .

    您可以将每个值用作 name 而是切换相关的 todo 国家财产。

    例子

    class App extends React.Component {
      state = {
        todo: {
          eat: true,
          sleep: false,
          react: true
        }
      };
    
      toggleCheckbox = e => {
        const { name } = e.target;
        this.setState(prevState => ({
          todo: {
            ...prevState.todo,
            [name]: !prevState.todo[name]
          }
        }));
      };
    
      render() {
        return (
          <div>
            {Object.keys(this.state.todo).map((val, i) => (
              <div key={i}>
                <input
                  type="checkbox"
                  name={val}
                  onChange={this.toggleCheckbox}
                  checked={this.state.todo[val]}
                />
                <label>{val}</label>
              </div>
            ))}
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById("root"));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    
    <div id="root"></div>