gpt4 book ai didi

javascript - react 重新渲染问题

转载 作者:搜寻专家 更新时间:2023-11-01 04:40:24 26 4
gpt4 key购买 nike

我正在创建一个网络应用程序,它允许用户在屏幕上拖动多个部分,每个部分都包含单独的特定数据。如果用户想在屏幕上添加更多片段,他们只需单击一个按钮,就会出现另一片段。我使用 React DND(拖放)库来保持我的组件解耦,到目前为止效果很好。问题在于在屏幕上添加更多片段的动态特性。目前(在下面的子代码中),我正在获取旧状态对象,执行浅拷贝,并将新创建的对象与预先存在的状态对象合并,并在完成时更新状态。但是,每次我执行此操作时,一切正常(屏幕上生成新片段),直到我移动一个新片段并出现以下错误:

Cannot update during an existing state transition (such as within render). Render methods should be a pure function of props and state.

我怎样才能摆脱这个错误,并拥有状态对象更新。

注意:按钮(在下面的屏幕截图中)显示了状态对象中对象数量的当前计数。所以下面我在状态中添加了 7 个对象

应用截图: enter image description here家长:

  import React, { Component, PropTypes } from 'react';
import Header from '../../components/Header/header';
import Footer from '../../components/Footer/footer';
import Student from '../../components/box1/box1';
import Box from '../../components/box2/box2';
import { DragDropContext } from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';
require('./home.css');


var Home = React.createClass({
getDefaultProps: function(){

return{ count: 3 }
},

getInitialState: function(){
return{ count: this.props.count }
},

add: function(){
this.setState({ count: this.state.count + 1 });
},

render() {

return (
<div id="main">
<Box count = {this.state.count}/>
<button count = {this.state.count} onClick = {this.add} > {this.state.count} </button>
</div>

);
}
});

export default DragDropContext(HTML5Backend)(Home);

child :

import React from 'react';
var ItemTypes = require('../box1/Constants').ItemTypes;
var DropTarget = require('react-dnd').DropTarget;
var Student = require('../box1/box1');
import update from 'react/lib/update';


require('./box2.css');

var BoxSource = {
drop: function (props, monitor, component) {
const item = monitor.getItem();
console.log(item);
const delta = monitor.getDifferenceFromInitialOffset();
const left = Math.round(item.left + delta.x);
const top = Math.round(item.top + delta.y);
const id = item.id;

component.move(id, left, top);
}
};

function collect(connect, monitor) {
return {
connectDropTarget: connect.dropTarget(),
didDrop: monitor.didDrop(),
source: monitor.getSourceClientOffset(),
item: monitor.getItem(),
drop: monitor.didDrop(),
result: monitor.getDropResult()
};
}

var box2 = React.createClass({

getInitialState: function() {
return { Students: {
'0': { top: 20, left: 80 },
'1': { top: 180, left: 20 },
'2': { top: 130, left: 20 },

}
};
},


componentWillReceiveProps: function(nextProps) {
var i = this.props.count;
console.log(this.state.Students);
var obj = update(this.state,{

Students:{
$merge:{
[i]:{
top: 10,
left:10
}
}
}
});

this.setState(obj);
},

move: function(id,left,top){
this.setState(update(this.state,{
Students:{
[id]:{
$merge:{
left:left,
top: top
}
}
}
}));
},

render:function() {
const { Students } = this.state;
var connectDropTarget = this.props.connectDropTarget;
return connectDropTarget(
<div id = "box">
{Object.keys(Students).map(key =>{
const { left, top, title } = Students[key];
return(
<Student key = {key} id = {key} left = {left}
top = {top}> </Student>
);})}
</div>
);
}
});

module.exports = DropTarget(ItemTypes.STUDENT, BoxSource, collect)(box2);

最佳答案

看起来问题可能出在您的“学生”组件中。在没有“Student”组件的情况下运行上面的代码(因为它没有发布),工作正常。如果您还没有解决这个问题,请同时发布 box1.js。

关于javascript - react 重新渲染问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36230523/

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