gpt4 book ai didi

javascript - React hooks - useState() 中的状态在路由更改时不会重置

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:07 36 4
gpt4 key购买 nike

const Create = () => {
console.log('rerender !!')
const [parcelType, setParcelType] = useState('paper')
console.log('parcelType =', parcelType)

return (
<Container onClick={() => setParcelType('plastic')}>
<BookingList />
<Card title="Business">
<p>Header</p>
</Card>
</Container>
)
}

export default Create

我想在创建组件中单击容器时将 parcelType 状态更改为“塑料”。我想在路线更改时将 parcelType 状态重置为“纸”(创建组件重新渲染)。但是当组件重新渲染状态没有设置为paper

更多细节:CreateComponent 在 BookingList 组件中的路由更改时重新渲染

 const BookingList = props => {
const { id } = props.match.params
const containerStyle = useTranslateSpring('-100px', '0')

const itemList = items.map((item, idx) => {
const itemStyle = useTranslateSpring('-100px', '0', '0', 200 + 200 * idx)
const url = `/booking/${item.id}/create`

return (
<ItemContainer
onClick={() => props.history.push(url)}
style={itemStyle}
key={item.id}
isactive={id === item.id}
>
{item.id}
</ItemContainer>
)
})
return <Container style={containerStyle}>{itemList}</Container>
}

export default withRouter(BookingList)

创建组件通过routeTemplate在路由中渲染

const Routes = () => (
<Router basename={process.env.REACT_APP_BASE_URL}>
<>
<RouteTemplate
exact
path="/booking/:id/create"
component={Booking.create}
title="Booking"
/>
</>
</Router>
)

而RouteTemplate是由PageTemplate组件包裹的renderComponent

  const RouteTemplate = props => {
const {
component: Component,
title,
query,
isAuthenticated,
isLanding,
...rest
} = props

return (
<Route
{...rest}
render={matchProps =>
isAuthenticated ? (
<PageTemplate title={title} isLanding={isLanding}>
<Component {...matchProps} query={query} />
</PageTemplate>
) : (
<Redirect
to={{
pathname: '/',
state: { from: props.location },
}}
/>
)
}
/>
)
}

最佳答案

所以我假设您想在路由更改后重置组件的状态。

这应该发生在任何你使用功能组件+钩子(Hook)或基于类的组件显式 this.state 的地方。 .这就是 React 在底层的工作方式。

  1. 您已经拥有 <Create>在页面呈现
  2. 路线改变后<Route>尝试渲染 <Create>元素
  3. React 发现已经存在 <Create>元素并尝试更新它而不是重新创建(通常更新比重新创建更有效)。这就是状态未重置的原因 - 因为它不应为更新而重置。

有不同的处理方式。

如果这种情况发生在 react-router 的 <Route> 之外我建议 use key Prop 重置状态。但是对于 <Route>这将意味着更换更清晰/直接的 <Route path="..." component={Create} />更冗长 <Route path="..." render={({match}) => <Create match={match} key={match.params.id} />}

因此,让我们应用 useEffect钩子(Hook)重置状态一次props.match.params.id已更改:

const Create = ({ match: {params: {id} } }) => {    

useEffect(() => {
setParcelType('paper');
}, [id]);

那应该等于class-based

state = {
typeOfWhatEver: 'paper'
};

componentDidUpdate(prevProps) {
if(prevProps.match.params.id !== this.props.match.params.id) {
this.setState({
typeOfWhatEver: 'paper'
});
}
}

关于javascript - React hooks - useState() 中的状态在路由更改时不会重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55254269/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com