我试图转换一个简单的React组件与一个this.setstate回调到一个功能组件与useState/使用效果,但我不能复制相同的功能与后者。
我正在使用一个简单警报/通知系统的示例来在超时后追加和删除警报。沙箱:
https://codesandbox.io/s/class-and-function-callback-comparison-54tus?file=/src/index.js
相关比较代码:
const NoticesWithFunctionCallback = () => {
const [state, setState] = useState({
alerts: [],
show: false
});
const addNotice = (e) => {
setState({
alerts: [...state.alerts, ""]
});
};
useEffect(() => {
(async () => {
await timeout(3000);
console.log("timeout occurred");
const newAlerts = tail([...state.alerts]);
setState({
alerts: newAlerts
});
})();
}, [state.alerts]);
return (
<div className="App">
<h3>
Notices using function component with UseState and UseEffect callback
</h3>
<Generator addNotice={addNotice} />
<Container>
{state.alerts.map((item, index) => (
<Alert>some alert here</Alert>
))}
</Container>
</div>
);
};
class NoticesWithClassCallback extends React.Component {
state = {
alerts: [],
show: false
};
addNotice = (e) => {
this.setState(
{
alerts: [...this.state.alerts, ""]
},
async () => {
await timeout(3000);
console.log("timeout occurred");
const newAlerts = tail([...this.state.alerts]);
this.setState({
alerts: newAlerts
});
}
);
};
render() {
return (
<div className="App">
<h3>Notices using class component and setState callback</h3>
<Generator addNotice={this.addNotice} />
<Container>
{this.state.alerts.map((item, index) => (
<Alert>some alert here</Alert>
))}
</Container>
</div>
);
}
}
我希望得到关于如何使用usestate/useffect将正确运行的类组件setstate回调组件替换为函数组件的建议。
欢迎任何建议。
从类到功能组件有一些步骤:
步骤1:
class NameOfComponent extends Component
变成
function NameOfComponent(props){
步骤2:删除构造函数
第三步:去掉渲染()
方法,保留返回
第四步。在所有方法之前添加const
步骤5:删除整个组件中的此状态
步骤6.删除整个组件中对this的所有引用
步骤7:设置初始状态与
useState()
(并导入它从反应)
数字示例:
const [count, setCount] = useState(0) // the useState() param is the initial value
对象的示例:
const [form, setValues] = useState({
id: 0,
first: ‘’,
last: ‘’,
password: ‘’,
subscribe: false
})
步骤8:-通过您定义的setter更改
this.setState()
(例如步骤7中的setValues或setCount)
this.set状态({计数:this.state.count1)}
将成为setCount(计数1)
步骤9:将componentDidMount
替换为useffect
useEffect(() => {
fetch(‘url’)
.then(res => res.json())
.then(items => setSomething(items)
.catch(console.log(err))
}, [])
步骤10:替换componentDidUpdate,否则componentWillReceiveProps将使用useEffect
useEffect(() => {
console.log(myPropsToCheck+ " has changed ! ")
}, [myPropsToCheck])
})
在这里没有使用的必要。每次更改警报阵列时都会触发useEffect:通过向其中添加项以及删除项。它也会在初始化后立即触发,所以事情会变得一团糟。相反,您应该修改addNotice函数并使用前一个函数更新状态,如下所示:
const NoticesWithFunctionCallback = () => {
const [state, setState] = useState({
alerts: [],
show: false
});
const addNotice = (e) => {
setState({
...state,
alerts: [...state.alerts, '']
});
(async () => {
await timeout(3000);
setState(prevState => {
return {
...prevState,
alerts: [...tail([...prevState.alerts])]
}
});
})()
};
return (
<div className="App">
<h3>
Notices using function component with UseState and UseEffect callback
</h3>
<p>I want this to replicate the class component but its broken...</p>
<Generator addNotice={addNotice} />
<Container>
{state.alerts.map((item, index) => (
<Alert key={index}>Alert</Alert>
))}
</Container>
</div>
);
};
我一直在试图理解什么时候取消订阅(在use效应中的回调)会被准确地调用。 这是代码笔链接:https://codepen.io/deen_john/pen/eYmNdMy代码: 问题:在我的例子中,使用效果钩子中的回调函数(即取消订阅),每次我点击按钮时都会被调用(即每次我更新按钮状态)。但是,根据React留档,use效应中的回调工作类似于组件WillUnMount生命周期,所以在我的例子中,它
我正在使用useState设置文本输入,我正在使用use效应覆盖后退按钮的行为。 这总是导致记录的文本成为useState的初始值。如果我不使用useEffect,它可以工作,但我不想在每次更改时都设置导航选项。我可以从useEffect中的useState获取当前值,还是需要其他解决方案?
我正在尝试使用react钩子创建一个悬停以显示div,我遇到了以下问题: 第69:31行:在函数“renderHideOptionalClauseTrigger”中调用React钩子“useState”,该函数既不是React函数组件,也不是自定义React钩子函数React钩子/钩子规则 搜索关键字以了解有关每个错误的更多信息。 以下是我的代码库:
我在学反应。我读过一篇文章,建议我们使用函数组件,而不是扩展react.component的类,所以我跟着做了。我也使用箭头函数而不是函数关键字。即: 有没有一种方法可以使用setState()来代替setName()、setId()、…等?或者任何建议? 非常感谢!
我在问之前找了很多,但似乎找不到一个适合我的解决方案。 我有一个函数,我需要在状态设置为新值后调用。 即使该函数是作为setState回调调用的,它仍然获得旧值。
我在TypeScript中有一个React组件,看起来像这样: 我希望能够指定我的propTypes()中的函数使用对象,但我不知道怎么做。