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

未正确更新React复选框(语义用户界面)

  •  2
  • fuzzybear  · 技术社区  · 8 年前

    这很奇怪,简单的复选框组件状态改变,道具不更新,用户界面不更新!

    import React, { Component } from 'react';
    import { Checkbox } from 'semantic-ui-react'
    
    export default class UiCheckBox extends Component {
        constructor(props) {
            super(props);
    
            this.state = {
                name: '',
                label: '',
                checked: false
            };
        }
    
        render() {
            return (
                <Checkbox label={this.props.label} name={this.props.name} checked={this.props.checked} onChange={this.handleChange.bind(this)} />
            );
        }
    
        handleChange() {
            this.setState({
                checked: !this.state.checked
            });
            console.log("prop:" + this.props.checked);
            console.log("state:" + !this.state.checked);
        }
    }
    

    如果我改变

    checked={this.props.checked}
    

    为了这个

    checked={this.state.checked}
    

    它可以工作,但我不能设置复选框的初始值,我做错了什么,ps我确定这是工作较早[诚实]?

    我就是这么用的。

    <UiCheckBox name={"Tea"} label={"Tea"} checked={false} />
    

    有人知道吗? 谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   Arman Charan    8 年前

    你的 handleChange() 仅更改 this.state.checked 是的。 this.state.已检查 不用于 render() 方法。因此,不会发生可见的变化。

    如果你想改变 props :你必须通过 function 那个 updates 这个 original data store 是的。

    其他:你可以设置 default state 使用 道具 是的。

    下面是一个实际的例子

    // Check Box.
    class CheckBox extends React.Component {
    
      // State.
      state = {checked: this.props.checked}
    
      // Render.
      render() {
        const {checked} = this.state
        return (
          <React.Fragment>
            <label>{`${checked}`}</label>
            <input type="checkbox" checked={checked} onChange={this.toggle}/>
          </React.Fragment>
        )
      }
      
      // Toggle.
      toggle = event => this.setState(state => ({checked: !state.checked}))
      
    }
    
    // Mount.
    ReactDOM.render(<CheckBox checked={true}/>, document.querySelector('#root'))
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <div id="root"></div>