vis*_*vis 5 reactjs react-hooks
我有一个React组件,它使用useEffect钩子来获取数据,如下所示:
const cache = {key: "data-fetched-using-key"}
function Config({key, options}) {
const [data, setData] = useState();
useEffect(() => {
const fetchedData; // fetch data using key and options
setData(fetchedData);
cache[key] = fetchedData;
}, [key, options])
return <p>{data}</p>;
}
Run Code Online (Sandbox Code Playgroud)
每次key或每次options更改时都会挂上钩子。但是,我也在本地缓存数据,并且只希望当两个keyAND都options更改时才运行效果(因为对于每个键/选项组合,数据始终是相同的)。
有没有一种干净的方法可以依赖于使用React Hooks 的keyAND options而不是keyOR 的组合options?
您可以使用useRef(). 考虑以下示例和沙箱:https : //codesandbox.io/s/react-hooks-useeffect-with-multiple-reqs-6ece5
const App = () => {
const [name, setName] = useState();
const [age, setAge] = useState();
const previousValues = useRef({ name, age });
useEffect(() => {
if (
previousValues.current.name !== name &&
previousValues.current.age !== age
) {
//your logic here
console.log(name + " " + age);
console.log(previousValues.current);
//then update the previousValues to be the current values
previousValues.current = { name, age };
}
});
return (
<div>
<input
placeholder="name"
value={name}
onChange={e => setName(e.target.value)}
/>
<input
placeholder="age"
value={age}
onChange={e => setAge(e.target.value)}
/>
</div>
);
};
Run Code Online (Sandbox Code Playgroud)
工作流程:
ref为要跟踪的两个值创建一个对象,在本例中为 aname和age。ref 对象是previousValues.useEffect已定义,但我们不为其提供任何依赖项。相反,我们只是让它在name或的状态发生变化时执行
age。useEffect我们有条件逻辑来检查两者的先前/初始值name和age是否与其对应的状态值不同。如果它们是好的,我们就执行我们的逻辑(console.log)。(previousValues)为当前值(state)。为了在两个值更改时运行效果,您需要利用之前的值并在键或选项更改时在钩子内比较它们。
您可以编写一个usePrevious钩子并比较本文中提到的旧状态和先前状态:
如何在 React Hooks useEffect 上比较 oldValues 和 newValues?
function usePrevious(value) {
const ref = useRef();
useEffect(() => {
ref.current = value;
});
return ref.current;
}
const cache = {key: "data-fetched-using-key"}
function Config({key, options}) {
const [data, setData] = useState();
const previous = usePrevious({key, options});
useEffect(() => {
if(previous.key !== key && previous.options !== options) {
const fetchedData; // fetch data using key and options
setData(fetchedData);
cache[key] = fetchedData;
}
}, [key, options])
return <p>{data}</p>;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |