【问题标题】:Usage of State in functional component of React在 React 的功能组件中使用状态
【发布时间】:2021-08-07 19:39:26
【问题描述】:

如何在 React 的功能组件中使用 State?

我有一个像下面这样的组件

import React, { useState } from 'react';

function App() {
  const [count] = React.useState(0);    //Set State here

  function count_checkbox() {
    var applicable = [];
    const cbs = document.querySelectorAll('input[class*="checkbox_value"]');
    cbs.forEach((cb) => {
      if (cb.checked) {
        applicable.push(parseInt(cb.value));
      }
    });
    this.setState({ count: applicable.length })  //Update State here
  }

  return (
    <div className="App">
        <input type="submit" id="button" value="{ this.state.count }"/>   //Use State here
    </div>
  );
}

export default App;

但状态在这里不起作用。

【问题讨论】:

标签: reactjs react-functional-component react-state


【解决方案1】:

状态应该是这样的

const [count,setCount] = React.useState(0); //setState

function count_checkbox() {
    var applicable = [];
    const cbs = document.querySelectorAll('input[class*="checkbox_value"]');
    cbs.forEach((cb) => {
      if (cb.checked) {
        applicable.push(parseInt(cb.value));
      }
    });
    setCount(applicable.length)  //Update State here
  }

setCount 设置状态计数。

【讨论】:

  • 谢谢@Thennarasu Ramasamy。我正在尝试使用此代码function count_checkbox() { var applicable = []; const cbs = document.querySelectorAll('input[class="checkbox_value"]'); cbs.forEach((cb) =&gt; { if (cb.checked) { applicable.push(parseInt(cb.value)); } }); setCount(applicable.length) alert(count); } 我得到的是以前的值而不是当前值。为什么?
【解决方案2】:

在功能组件中更新状态与类组件不同。 useState 钩子返回一个由值和一个 setter 组成的数组。

然后调用 setter 函数来更新状态的值。

const [count, setCount] = React.useState(0);

function count_checkbox() {
  ...
  setCount(applicable.length)
}

【讨论】:

  • 谢谢@koralarts。我正在尝试使用此代码function count_checkbox() { var applicable = []; const cbs = document.querySelectorAll('input[class="checkbox_value"]'); cbs.forEach((cb) =&gt; { if (cb.checked) { applicable.push(parseInt(cb.value)); } }); setCount(applicable.length) alert(count); } 我得到的是以前的值而不是当前值。为什么?
【解决方案3】:

this.setState 未用于更新类组件中的状态。为了更新功能组件中的状态,您需要使用适当的功能对其进行更新。

useState 返回 2 个值,第一个是当前状态值,第二个是更新该状态的函数

 const [count, setCount] = React.useState(0); 

每当您想更新count 状态时,您都需要使用setCount 函数进行更新


  function count_checkbox() {
    ...
    setCount(applicable.length); //Update State here
  }

您可以在useEffect 中访问count,如下所示:-

useEffect(() => {
  alert(count);
}, [count])

【讨论】:

  • 谢谢@Priyank Kachhela。我正在尝试使用此代码function count_checkbox() { var applicable = []; const cbs = document.querySelectorAll('input[class="checkbox_value"]'); cbs.forEach((cb) =&gt; { if (cb.checked) { applicable.push(parseInt(cb.value)); } }); setCount(applicable.length) alert(count); } 我得到的是以前的值而不是当前值。为什么?
  • setCount 是异步的,因此它不会立即反映在警报中,因此您需要使用 useEffect 来检查正确的值。
  • 谢谢@Priyank Kachhela。如何使用 useEffect ?我是 React 新手。
  • 我已经更新了我的答案,有关更多信息,请参阅此文档:reactjs.org/docs/hooks-effect.html
【解决方案4】:

函数式组件只是一个普通的 javascript 函数,它以 props 作为参数并返回一个反应元素。 无状态组件没有状态,这意味着您无法访问其中的this.statethis.setState()。它也没有生命周期,所以你不能使用 componentDidMount 和其他钩子。

import React, { useState } from 'react';

function App() {
  const [count, setCount] = React.useState(0);    //Set initial state here

  function count_checkbox() {
    var applicable = [];
    const cbs = document.querySelectorAll('input[class*="checkbox_value"]');
    cbs.forEach((cb) => {
      if (cb.checked) {
        applicable.push(parseInt(cb.value));
      }
    });
    setCount(applicable.length) //Update State here
  }

  return (
    <div className="App">
      <input type="submit" value={`Apply tax to  ${ count }  item(s)`} />   //You Can't use this.state.count here
    </div>
  );
}

export default App;

【讨论】:

  • const [count, setCount] = React.useState(0);你可以设置初始值为0
  • 我想知道 input[submit] 是否有 value 属性。我将其视为输入[文本]。
  • 这样试试。 setCount(applicable.length, () =&gt; { alert(count);});请参考这里 facebook.github.io/react/docs/react-component.html#setstate
  • 你可以这样做。 Apply tax to ${ count } item(s) />
  • 我编辑了我的答案,因为很难在评论中显示代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 2016-03-06
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2021-03-14
  • 2022-11-13
相关资源
最近更新 更多