在每个模块的仪表板中,其布局数据(使用react-grid-layout)与模块数据分开存储,并且每个都存储在数据库中。当前模块数据和布局数据存储在仪表板组件状态中。每当模块或布局的先前状态与当前状态不同时,我都试图在componentDidMount()
中调用单独的axios POST请求,以将更改保存在数据库中。但是通过调试和日志记录,我发现prevState
等于this.state
。
以下是更改相关状态的方法和componentDidMount()
方法:
componentDidUpdate(prevProps, prevState) {
// JSON.stringify comparison for proof of concept since the order does not change
if(JSON.stringify(prevState.modules) !== JSON.stringify(this.state.modules))
API.post('Adminusers/StoreUserModuleData', "module_data=" + JSON.stringify(this.state.modules))
.then((res) => console.log(res))
.catch(err => {throw new Error(err)});
if(JSON.stringify(prevState.layouts) !== JSON.stringify(this.state.layouts))
API.post('Adminusers/StoreAdminUserLayouts', "layouts=" + JSON.stringify(this.state.layouts))
.then((res) => console.log(res))
.catch(err => {throw new Error(err)});
}
addNewModuleInLayout(moduleData) {
let newLayout = this.state.layouts;
let newModule = this.state.modules;
for (let key in newLayout) {
if (newLayout.hasOwnProperty(key)) {
newLayout[key].push({
i: moduleData.type,
x: (newLayout[key].length * 1) % 3,
y: Infinity,
w: 1,
h: 5
});
}
}
newModule.push(moduleData);
this.setState({layouts: newLayout, modules: newModule})
}
removeModule(layoutId, type) {
let newLayout = this.state.layouts;
let newModule = this.state.modules;
for (let key in newLayout)
newLayout[key] = newLayout[key].filter(item => { return item.i !== layoutId })
newModule = newModule.filter(item => {return item.type != type});
this.setState({ modules: newModule, layouts: newLayout });
}
某个模块的模块数据和布局数据的示例为:
// layouts
{
"md": [{ i: "current-user", x: 0, y: 0, w: 3, h: 5, isDraggable: false, isResizable: true }],
"lg": [{ i: "current-user", x: 0, y: 0, w: 3, h: 5, isDraggable: false, isResizable: true }],
"sm": [{ i: "current-user", x: 0, y: 0, w: 3, h: 5, isDraggable: false, isResizable: true }],
"xs": [{ i: "current-user", x: 0, y: 0, w: 3, h: 5, isDraggable: false, isResizable: true }]
}
// module data
[{ type: "current-user", content: " ", title: "Current User Module" }]
任何人都可以在这两个状态相等的情况下指导我在做什么吗?
答案 0 :(得分:1)
尝试将addNewModuleInLayout
和removeModule
中的数组声明更新为
const newLayout = { ...this.state.layouts }; // from let newLayout = this.state.layouts
const newModule = [...this.state.modules]; // from let newModule = this.state.modules
在cDM中,您不会在状态上创建模块/布局数组的“新”副本,而是直接引用该数组。当您更新数组时,您实际上是在改变状态,因此当您将prevState
与this.state
进行比较时,字符串化版本是相等的。
这不会深深地复制您的布局对象,因此在推送到布局数组时会遇到相同的问题。您可能可以通过在更新布局时创建一个新数组来解决此问题,而不用按下
newLayout[key] = [
...newLayout[key],
{
i: moduleData.type,
x: (newLayout[key].length * 1) % 3,
y: Infinity,
w: 1,
h: 5
}
]; // from newLayout[key].push({DATA}); in addNewModuleInLayout
由于您在filter
中使用了removeModule
,因此您应该在那里{p>