开发者问题收集

如何使用 React Hooks 用当前状态和先前状态来更新当前状态

2020-06-09
864

在我的 React 应用程序中,我有一个父组件和一个子组件。在我的父组件中,我包含了来自子组件的过滤器。无论我从过滤器中选择什么值,我都会将其传递给我的 api 请求参数,该参数在我的 ParentComponent 中的 handleFilterChange 方法下调用。但是,我注意到,如果我从 ChildComponent 中选择一个过滤器,它会被正确传递,但是当选择两个过滤器时,它总是传递最新选择的过滤器值。所以,我认为,我需要以某种方式在 handleFilterChange 方法中保存我之前的状态,但不确定如何实现它。 这是我的代码片段。

ParentComponent.js-

const ParentComponent = props => {
  const [filterObj, setFilterObj] = useState({});

  const handleFilterChange = filters => {
    console.log(filters); // Show only latest selected filter
    setFilterObj(filterObj);
    //API call which will pass filters in request params
  };

  return (
    <ChildComponent onChange={handleFilterChange} />
  );
}

ChildComponent.js

const ChildComponent = props => {

  const handleChange = value => {
    console.log(values);// Shows all of the selected filters
    onChange({
      ...Object.keys(values).reduce((val, key) => (isEmpty(value[key]) ? val : { [key]: value[key] }), {}),
    });
  };

  return (
    <Filter onFilterChange={handleChange} />
  );
}

例如,我有过滤器 A 和过滤器 B。第一次,当我选择过滤器 A 时,我看到参数值有过滤器 A,并且相同的值被传递给我的 ParentComponent。但是,当我在选择过滤器 A 之后选择过滤器 B 时,它只会在 handleFilterChange 方法中将过滤器 B(最新选择的值)传递给我的 ParentComponent。因此,handleFilterChange 方法中的 filter 参数将只有一个对象,即 Filter B。我希望它有 Filter A 和 Filter B。 当单独选择过滤器时,我的代码可以正常工作,但只有当我尝试选择两个过滤器时,它才不起作用。这里的任何建议都会很有帮助。 请注意,参数、过滤器和值都是对象。

3个回答

在子级的 handleChange 函数中,您尚未将整个过滤器集传递给父级 onChange

在 Reduce 内部,您始终覆盖过滤器对象,而是需要合并值

更新的代码

const handleChange = value => {
    console.log(values);// Shows all of the selected filters
    onChange({
      ...Object.keys(values).reduce((val, key) => (isEmpty(value[key]) ? val : { ...val, [key]: value[key] }), {}),
    });
  };
Shubham Khatri
2020-06-09

您可以使用 useState() 钩子根据先前的状态更新当前状态。

const [state, setState] = React.useState(default) 

它采用您状态的默认值。

React.useState() 返回一个数组,其中第一个值是用于存储状态值的变量,第二个值是帮助更新该值的函数。

您可以简单地调用该函数并将新值传递给它来更新状态值。

Prabesh Gautam
2020-06-09

在 ReactJs 中,当组件状态改变时,允许重新渲染组件。因此,当您从父组件更改过滤器时,您只需更新状态,ReactJs 子组件会自动重新渲染调用的状态。

例如此 链接这里 codesendbox.io 或此代码上方:

父组件

import React, {useState} from "react";
import "./styles.css";
import Children from "./Children";

export default function App() {

  const [filter, setFilter] = useState('A');

  const handleChange = e => setFilter(e.target.value);

  return (
    <>
      Filter:{" "}
      <select onChange={(e)=>handleChange(e)}>
        <option value="A">A</option>
        <option value="B">B</option>
        <option value="C">C</option>
      </select>
      <Children filter={filter} />
    </>
  );
}

子组件

import React from "react";

const Children = props => {
  return <h1>Children filder is : {props.filter}</h1>;
};
export default Children;

最后,输出为:

在此处输入图像描述

注意: 此答案仅适用于明确概念父级和 ReactJS 中的 child

==== 谢谢 ====

Md. Abu Sayed
2020-06-09