【问题标题】:How to convert class based component into function based component?如何将基于类的组件转换为基于函数的组件?
【发布时间】:2020-07-31 20:12:28
【问题描述】:

现在我有一个基于类的组件,但我想将我的组件转换为基于函数的。代码在下面。 我选择了在基于类的组件中编写的所有复选框。但现在我想将该组件转换为基于函数的,我已将所有方法和道具更改为我的代码,但存在一些状态错误。我没有收到可能的错误。

import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import './index.css';
import { Checkbox } from 'antd';

const CheckboxGroup = Checkbox.Group;

const plainOptions = ['Apple', 'Pear', 'Orange'];
const defaultCheckedList = ['Apple', 'Orange'];

class App extends React.Component {
  state = {
    checkedList: defaultCheckedList,
    indeterminate: true,
    checkAll: false,
  };

  onChange = checkedList => {
    this.setState({
      checkedList,
      indeterminate: !!checkedList.length && checkedList.length < plainOptions.length,
      checkAll: checkedList.length === plainOptions.length,
    });
  };

  onCheckAllChange = e => {
    this.setState({
      checkedList: e.target.checked ? plainOptions : [],
      indeterminate: false,
      checkAll: e.target.checked,
    });
  };

  render() {
    return (
      <div>
        <div className="site-checkbox-all-wrapper">
          <Checkbox
            indeterminate={this.state.indeterminate}
            onChange={this.onCheckAllChange}
            checked={this.state.checkAll}
          >
            Check all
          </Checkbox>
        </div>
        <br />
        <CheckboxGroup
          options={plainOptions}
          value={this.state.checkedList}
          onChange={this.onChange}
        />
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('container'));

now I am converting my component into function-based. but having an issue. Can anybody suggest me the possible mistake, please ... the checkbox is showing all options but unable to check the box or cant check all options at once. Can anybody suggest me some answer so I can solve my issue?

import React, {useState} from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import './index.css';
import { Checkbox } from 'antd';

const CheckboxGroup = Checkbox.Group;

const plainOptions = ['Apple', 'Pear', 'Orange'];
const defaultCheckedList = ['Apple', 'Orange'];

function App (props) {
  state = {
    checkedList: defaultCheckedList,
    indeterminate: true,
    checkAll: false,
  };

  const onChange = checkedList => {
    this.setState({
      checkedList,
      indeterminate: !!checkedList.length && checkedList.length < plainOptions.length,
      checkAll: checkedList.length === plainOptions.length,
    });
  };

  const onCheckAllChange = e => {
    this.setState({
      checkedList: e.target.checked ? plainOptions : [],
      indeterminate: false,
      checkAll: e.target.checked,
    });
  };


    return (
      <div>
        <div className="site-checkbox-all-wrapper">
          <Checkbox
            indeterminate={this.state.indeterminate}
            onChange={this.onCheckAllChange}
            checked={this.state.checkAll}
          >
            Check all
          </Checkbox>
        </div>
        <br />
        <CheckboxGroup
          options={plainOptions}
          value={this.state.checkedList}
          onChange={this.onChange}
        />
      </div>
    );

}

ReactDOM.render(<App />, document.getElementById('container'));

【问题讨论】:

    标签: reactjs antd ant-design-pro


    【解决方案1】:

    在类组件中,您只需编写一个状态对象“this.state”并描述该对象中的状态,但在功能组件中情况会有所不同。

    您应该使用 React 钩子,并且必须使用数组常量分别设置每个状态。

    如果我们假设代码完全没有错误/错误,代码将是这样的:

    (注意'this.'只用在类组件中)

    import React, { useState } from 'react';
    import ReactDOM from 'react-dom';
    import 'antd/dist/antd.css';
    import './index.css';
    import { Checkbox } from 'antd';
    
    const CheckboxGroup = Checkbox.Group;
    
    const plainOptions = ['Apple', 'Pear', 'Orange'];
    const defaultCheckedList = ['Apple', 'Orange'];
    
    
    function App(props) {
      const [checkedList, setCheckedList] = useState(defaultCheckedList);
      const [indeterminate, setIndeterminate] = useState(true);
      const [checkAll, setCheckAll] = useState(false);
    
      const onChange = event => {
        setCheckedList(event);
        setIndeterminate(!!event.length && event.length < plainOptions.length)
        setCheckAll(event.length === plainOptions.length)
      };
    
      const onCheckAllChange = e => {
        setCheckedList(e.target.checked ? plainOptions : []);
        setIndeterminate(false);
        setCheckAll(e.target.checked);
      };
    
    
      return (
        <div>
          <div className="site-checkbox-all-wrapper">
            <Checkbox
              indeterminate={indeterminate}
              onChange={onCheckAllChange}
              checked={checkAll}
            >
              Check all
                  </Checkbox>
          </div>
          <br />
          <CheckboxGroup
            options={plainOptions}
            value={checkedList}
            onChange={onChange}
          />
        </div>
      );
    
    }
    
    ReactDOM.render(<App />, document.getElementById('container'));
    

    数组的第二个参数改变第一个参数的数量,然后调用屏幕更新api。

    您可以在React Docs了解更多关于功能组件生命周期的信息。

    【讨论】:

    • 它解决了我的问题。当然我会在给定的链接上了解更多信息。
    【解决方案2】:

    替换:

    state = {
      checkedList: defaultCheckedList,
      indeterminate: true,
      checkAll: false,
    };
    

    与:

    const [checkedList, setCheckedList] = React.useState(defaultCheckedList);
    const [indeterminate, setIndeterminate] = React.useState(true);
    const [checkAll, setCheckAll] = React.useState(false);
    

    要渲染状态,只需使用第一项:

    <div>{indeterminate}</div>
    

    要更改状态,请使用第二项:

    setIndeterminate(false);
    

    【讨论】:

      【解决方案3】:

      在函数组件中,你不能那样使用状态

      在 react Hooks 之前,你没有机会拥有 state 的内部函数组件。幸运的是,在 react 16.8 之后你有 React Hooks

      在您的情况下,您必须使用 useState(); 钩子并将您当前的状态放入该钩子中。

      import React, {useState} from 'react';
      import ReactDOM from 'react-dom';
      import 'antd/dist/antd.css';
      import './index.css';
      import { Checkbox } from 'antd';
      
      const CheckboxGroup = Checkbox.Group;
      
      const plainOptions = ['Apple', 'Pear', 'Orange'];
      const defaultCheckedList = ['Apple', 'Orange'];
      
      function App (props) {
        const [state, setState] = useState({
          checkedList: defaultCheckedList,
          indeterminate: true,
          checkAll: false,
        });
      
        const onChange = checkedList => {
          setState({
            checkedList,
            indeterminate: !!checkedList.length && checkedList.length < plainOptions.length,
            checkAll: checkedList.length === plainOptions.length,
          });
        };
      
        const onCheckAllChange = e => {
          setState({
            checkedList: e.target.checked ? plainOptions : [],
            indeterminate: false,
            checkAll: e.target.checked,
          });
        };
      
      
          return (
            <div>
              <div className="site-checkbox-all-wrapper">
                <Checkbox
                  indeterminate={state.indeterminate}
                  onChange={onCheckAllChange}
                  checked={state.checkAll}
                >
                  Check all
                </Checkbox>
              </div>
              <br />
              <CheckboxGroup
                options={plainOptions}
                value={state.checkedList}
                onChange={onChange}
              />
            </div>
          );
      
      }
      
      ReactDOM.render(<App />, document.getElementById('container'));
      
      

      其他 this 关键字您只有类内组件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 2021-12-09
        相关资源
        最近更新 更多