MET*_*EAD 30 reactjs react-hooks
我正在尝试使用组件接收的道具使用React hook setState()设置状态。我尝试使用以下代码:
import React,{useState , useEffect} from 'react';
const Persons = (props) => {
// console.log(props.name);
const [nameState , setNameState] = useState(props)
console.log(nameState.name);
console.log(props.name);
return (
<div>
<p>My name is {props.name} and my age is {props.age}</p>
<p>My profession is {props.profession}</p>
</div>
)
}
export default Persons;
Run Code Online (Sandbox Code Playgroud)
问题是加载组件时正在设置状态。但是,当它收到新的道具时,状态不会更新。在这种情况下如何更新状态?提前致谢。
Shu*_*tri 44
useState
hooks函数参数仅使用一次,而不是每次prop更改时使用。您必须使用useEffect
钩子来实现所谓的componentWillReceiveProps/getDerivedStateFromProps
功能
import React,{useState , useEffect} from 'react';
const Persons = (props) => {
const [nameState , setNameState] = useState(props)
useEffect(() => {
setNameState(props);
}, [props])
return (
<div>
<p>My name is {props.name} and my age is {props.age}</p>
<p>My profession is {props.profession}</p>
</div>
)
}
export default Persons;
Run Code Online (Sandbox Code Playgroud)
for*_*d04 21
该props
中值useState(props)
仅用于在初始渲染,进一步状态更新与二传手完成setNameState
。
此外,useEffect
更新派生状态时不需要:
const Person = props => {
const [nameState, setNameState] = useState(props.name);
// update derived state conditionally without useEffect
if (props.name !== nameState) setNameState(props.name);
// ... other render code
};
Run Code Online (Sandbox Code Playgroud)
来自React 文档:
[...]你可以更新状态正确的渲染过程。React 将在退出第一次渲染后立即重新运行具有更新状态的组件,因此它不会很昂贵。
[...] 渲染过程中的更新在
getDerivedStateFromProps
概念上一直都是如此。
本质上,我们可以通过摆脱额外的浏览器重绘阶段来优化性能,因为useEffect
总是在渲染提交到屏幕后运行。
这是一个说明上述模式的人为示例 - 在实际代码中,您可以props.name
直接阅读。有关更合适的派生状态用例,请参阅React 博客文章。
const Person = props => {
const [nameState, setNameState] = useState(props.name);
// update derived state conditionally without useEffect
if (props.name !== nameState) setNameState(props.name);
// ... other render code
};
Run Code Online (Sandbox Code Playgroud)
const Person = props => {
const [nameState, setNameState] = React.useState(props.name);
// Here, we update derived state without useEffect
if (props.name !== nameState) setNameState(props.name);
return (
<p>
<h3>Person</h3>
<div>{nameState} (from derived state)</div>
<div>{props.name} (from props)</div>
<p>Note: Derived state is synchronized/contains same value as props.name</p>
</p>
);
};
const App = () => {
const [personName, setPersonName] = React.useState("Lui");
const changeName = () => setPersonName(personName === "Lukas" ? "Lui" : "Lukas");
return (
<div>
<Person name={personName} />
<button onClick={changeName}>Change props</button>
</div>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)
bsa*_*aka 16
这个大体思路可以放到hook中:
export function useStateFromProp(initialValue) {
const [value, setValue] = useState(initialValue);
useEffect(() => setValue(initialValue), [initialValue]);
return [value, setValue];
}
function MyComponent({ value: initialValue }) {
const [value, setValue] = useStateFromProp(initialValue);
return (...);
}
Run Code Online (Sandbox Code Playgroud)
为此,您需要使用useEffect
使您的代码看起来像。如果 pros 没有改变,你想避免再次重新渲染,那么你必须首先检查 useEffect ,然后将 props 设置为当前变量。
import React, { useState, useEffect } from "react";
const Persons = props => {
// console.log(props.name);
const [nameState, setNameState] = useState(props);
console.log(nameState.name);
console.log(props.name);
useEffect(
() => {
if (nameState !== props.name) {
setNameState(props.name);
}
},
[nameState]
);
return (
<div>
<p>
My name is {props.name} and my age is {props.age}
</p>
<p>My profession is {props.profession}</p>
</div>
);
};
export default Persons;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13333 次 |
最近记录: |