无法使用useState React将道具设置为状态

时间:2020-06-06 15:46:21

标签: javascript reactjs react-hooks use-effect use-state

我是新来的人。我已经阅读了React文档。我不知道为什么它不起作用。所以,我来这里。

我试图在反应中创建分页。以下是我的table组件。

const Table = (props) => {
  const { description, itemCount, tableHeaders, items } = props;

  const pageSize = 5;
  const [currentPage, setCurrentPage] = useState(1);

  function handlePageChange(page) {
    setCurrentPage(page);
  }

  const registerations = paginate(items, currentPage, pageSize);
  // HERE: registerations data is correct and then I pass it to TableBody component.

  return (
    <React.Fragment>
      <TableDescription description={description} count={itemCount} />
      <div className="bg-white block w-full md:table">
        <TableHeader items={tableHeaders} />
        <TableBody items={registerations} />
      </div>
      {/* Footer & Pagination */}
      <div className="bg-white block flex px-6 py-4 justify-between rounded-bl-lg rounded-br-lg">
        <div className="sm:flex-1 sm:flex sm:items-center sm:justify-between">
          <Pagination
            itemsCount={items.length}
            pageSize={pageSize}
            currentPage={currentPage}
            onPageChange={handlePageChange}
          />
        </div>
      </div>
      {/* end Footer & Pagination */}
    </React.Fragment>
  );

,并且TableBody组件接收该注册数组。 TableBody组件中的问题是我无法使用useState挂钩将props值设置为state。

const { items: passedItems } = props;
console.log(passedItems); // ok -> I got what I passed.

const [items, setItems] = useState(passedItems);
console.log(items); // not ok -> items is previously passed items.

我该如何纠正? 谢谢。

3 个答案:

答案 0 :(得分:3)

我希望它以当前形式运行:

const { items: passedItems } = props;
console.log(passedItems); // ok -> I got what I passed.

const [items, setItems] = useState([]);
console.log(items); // not ok -> items is previously passed items.
useEffect(() => {
  setItems(passedItems)
}, [passedItems])

答案 1 :(得分:2)

在使用useState挂钩时,您应该了解为什么我们需要useEffect,因此在基于类的组件中,您有权在this.setState中使用回调函数,这将为您提供当前的更新值

this.setState(() => {
  name: 'john'
}, () => console.log(this.state.name)) // you will get the immediate updated value

因此,当您使用功能组件

const [name, setName] = useState(props.name)
console.log(name) // won't get the updated value

要获取更新的值,可以使用React.useEffect钩子,该钩子将在数组deps作为第二个参数更改时触发。

useEffect(() => {
 // logic based on the new value
}, [name]) // so whenever the name value changes it will update and call this useEffect

可以通过三种方式调用useEffect

第一个

不传递deps数组

useEffect(() => {}) // this will call everytime

第二个

传递空数组

 useEffect(() => {}, []) // passing empty array,it will call one time like the componentDidMount of class based component

第三名

传递数组dep(依赖项)

 useEffect(() => {

} , [name, count]) // whenever there is an update of name and count value it will call this useEffect

因此,您可以按照以下方式进行操作

useEffect(() => {
  setItems(passedItems)
}, [passedItems]) // whenever passedItems changes this will call and setItems will set the new passedItems

希望您对此有个清楚的认识。

答案 2 :(得分:1)

state更改时,您需要添加useEffect来更新props

来自useState文档:

在随后的重新渲染过程中,useState返回的第一个值将始终是应用更新后的最新状态。

const TableBody = (props) => {
   const { items: passedItems } = props;

   // items is set to `passedItems` only on first render
   // subsequent renders will still retain the initial value in state
   // until `setItems` is called
   const [items, setItems] = useState(passedItems);
   
   // add a `useEffect` to update the state when props change
   useEffect(() => {
     setItems(items)
   }, [items])

   // 
}