我在正在构建的 Web 应用程序中多次遇到这种情况,我正在寻找一种最佳实践来实现和重构。
作为入门的一部分,用户将创建一个 pin,单击/点击一个按钮将其保存到状态并移动到新视图(或路线),重新输入 pin,然后单击/点击一个按钮以确认并提交它,将其发送到后端。
我正在尝试确定构建此功能的最佳方法,以处理在将信息发送到服务器之前发生在故事中间的无意刷新或刷新。
我看到了几种处理/构建它的方法:
- 我可以使用路由(即
foo.com/account/pin/create
然后foo.com/account/pin/confirm
)构建它,并通过路由器提供的道具传递引脚。但是,如果用户刷新/pin/confirm
,则传递的 pin/pin/create
会丢失。我可以检查道具并将它们重定向回/pin/create
并显示消息原因。 - 我可以在没有路由的情况下使用具有
state.view
道具的类容器来构建它。在渲染中,我会运行一个开关来确定基于state.view
. 例子:
class foo extends Component {
state = {
view: 'view1',
};
handleSubmit = () => {
// send data off
};
cycleView = () => {
this.setState(prevState => {
switch (prevState.view) {
case 'view1':
return { view: 'view2' };
case 'view2':
return { view: 'view3' };
case 'view3':
this.handleSubmit();
navigate('/dash');
break;
default:
return { view: 'notice' };
}
});
};
render() {
const { view } = this.state;
const mainComponent = () => {
switch (view) {
case 'view1':
return <View1 />;
case 'view2':
return <View2 />;
case 'view3':
return <View3 />;
}
};
return (
<div className="wrapper">
<ProgressIndicator currentStep={2} numberOfSteps={4} />
{mainComponent()}
<Nextbutton
ctaText="Next"
onClick={
view === 'view1' || view === 'view2'
? this.cycleView
: this.handleSubmit
}
/>
</div>
);
}
}
- 我可以使用 Redux-Persist 将其存储在本地存储中,但是将私有 PIN 放入浏览器的本地存储中感觉很麻烦。(这是否像我被引导相信的那样不安全?)此外,我倾向于更喜欢组合事物,并避免将本质上不是真正全球性的事物放入 Redux。
所以问题是这些选项中哪一个是最好的?或者有没有更好的我没有列出?
注意:我正在使用@reach/router。
编辑添加代码片段。