javascript - 对存储在本地存储中的组件的引用在刷新时未定义
问题描述
我有一个组件Widget
,它引用一个 Component 类及其属性作为道具并呈现它。
这个小部件是从一个组件渲染的,该WidgetList
组件映射到它存储在其状态中的小部件列表,并保持列表更新,localStorage
以便它可以在重新加载时保持不变。
class WidgetList extends React.Component {
constructor(props) {
super(props);
const storedWidgets = JSON.parse(localStorage.getItem('widgets')) || null;
this.state = {
widgets: storedWidgets
}
}
onChange(updatedWidgets) {
localStorage.setItem('widgets', JSON.stringify(updatedWidgets));
this.setState({ widgets: updatedWidgets });
}
render() {
<div>
{widgets.map(widget => (
<div key={widget.id}>
<Widget data={widget.data} />
</div>
))}
</div>
}
}
const Widget = (props) => {
const { component: Component, properties } = props.data;
console.log(Component, properties)
return <Component {...properties} />;
};
问题是,当我渲染它时,它工作正常,但刷新时失败。以及 的console.log
返回undefined
和Component
正确的对象properties
。
我认为问题在于该组件没有被重新导入,但我不明白如何解决这个问题。
解决方案
updatedWidgets
应该是一个包含反应组件的对象。问题是反应组件无法正确序列化JSON.stringify
并存储在localStorage
反应组件可以是一个类或函数,它们都不能与JSON.stringify
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
由于你不能JSON.stringify
函数或类,字符串是唯一可行的选择,想出在字符串和反应组件之间建立映射的方法,将字符串保存在 localStorage 并稍后转换回反应组件
就像是
const widgeMapping = {
widget1: function () {
return <div>widge functional component</div>
},
widget2: class extends Component {
render() {
return <div>widge class component</div>
}
}
}
const localStorageData = JSON.stringify({ component: 'widget', properties: { hello: 'world' } })
const parsedData = JSON.parse(localStorageData)
parsedData.component = widgeMapping(parsedData.component)
推荐阅读
- javascript - 空() div + 变量
- angular - Angular Material 单元测试 - 找不到 MatHarness 元素
- embedded - 如何决定何时在浮点数上使用定点算法?
- javascript - HTTP POST 请求适用于 Postman,但不适用于我的 Web 应用程序的 JavaScript 提取
- angular - 使用 ng-packagr 制作 Angular mono-repo 库
- python - 无法在 KIVY Python 中打印取自 kivy.uix.textinput.TextInput 的文本
- javascript - 选择具有相同属性 data-img_key="bull3" 的所有行
- excel - 无法在 Excel 中断开链接 - VBA
- visual-studio-code - 当我在 VS 代码终端中执行“~/.zshrc”时,我得到“权限被拒绝”。什么是好的解决方案?
- google-sheets - 动态使用多个 SUBSTITUTE 函数