我做了一个简单的应用程序(在react js中),它有两个列表,您可以向该列表中添加元素。一个是输入元素的列表,另一个是跨度的列表。
添加新元素后,span列表将完美呈现,但输入列表将呈现不同的外观。
这就是我的反应班的样子
var App = React.createClass({
getInitialState: function(){
return {
'app': {
'data': this.props.data,
'data2': this.props.data2
}
};
},
onclick: function(){
var dat = this.state.app.data;
var val = this.refs.input.getDOMNode().value;
dat.splice(0, 0, val);
var dat2 = this.state.app.data2;
dat2.splice(0, 0, val);
this.setState({'app': {
'data': dat,
'data2': dat2
}});
},
renderElement: function(i){
return(
<input defaultValue={i} />
);
},
renderElement2: function(i){
return(
<span>{i}</span>
);
},
render: function(){
var self = this;
return(
<div>
<input type="text" ref="input" placeholder="Enter a value"/>
<input type="button" value="Add value" onClick={this.onclick} />
<div className="col2">
{this.state.app.data.map(function(page, i){
return(
<div key={i}>{self.renderElement(page)}</div>
);
})}
</div>
<div className="col2">
{this.state.app.data2.map(function(page, i){
return(
<div key={i}>{self.renderElement2(page)}</div>
);
})}
</div>
</div>
);
}
});
这就是应用程序的呈现方式
var data = [1,2,3];
var data2 = [1,2,3];
React.render(<App data={data} data2={data2}/>, document.getElementById("main"));
这是演示
My test case:
I add 55 and expect the results to look like this
55
1
2
3
55
1
2
3
But I get
1
2
3
3
55
1
2
3
我在这里缺少基本的东西吗?
首先渲染看起来(大致)如下:
<div>
<div key={0}><input defaultValue="1" /></div>
<div key={1}><input defaultValue="2" /></div>
<div key={2}><input defaultValue="3" /></div>
</div>
<div>
<div key={0}><span>1</span></div>
<div key={1}><span>2</span></div>
<div key={2}><span>3</span></div>
</div>
酷,没有问题。然后,假设我在框中输入了“
foo”,然后单击“添加值”。通过将状态插入到第一项之前来更新状态(注意:splice(0,0,x)是unshift(x)),然后呈现此状态:
<div>
<div key={0}><input defaultValue="foo" /></div>
<div key={1}><input defaultValue="1" /></div>
<div key={2}><input defaultValue="2" /></div>
<div key={3}><input defaultValue="3" /></div>
</div>
<div>
<div key={0}><span>foo</span></div>
<div key={1}><span>1</span></div>
<div key={2}><span>2</span></div>
<div key={3}><span>3</span></div>
</div>
现在是时候让React接受这两个,并找出发生了什么变化。为此,它会比较组件(此处为div,span或input)和键。
与跨部开始,它会看到所有的代码都相同,但有它以前没有在看到新的密钥 结束 。它也看到了该值div[0] span
,div[1] span
以及div[2] span
都发生了变化。它在末尾插入带有文本3 的 新 元素,并更新其他范围。低效,但有效。
现在,对于输入…它执行大致相同的操作。前三个输入的键和标记是相同的,它告诉每个输入它们正在更新,它们检查它们是否具有值道具,如果没有,则请拒绝执行任何操作。
它看到最后有一个 新 输入。它位于div[3] input
,默认值为“ 3”。React插入新的输入,将值设置为3,更新完成。
继续进行时,上述过程相同,并且将继续更新跨度,div span
并div input
每次都插入新的跨度。
除了defaultValue之外,这里的主要问题是我的键倒置了,除了我认为不应该使用的defaultValue之外!项目是在开始处插入的,因此键应该下降而不是上升。可以通过使用项目的长度并从中减去索引来解决此问题。如果length为4,则关键点将为4,3,2,1。
this.state.app.data.map(function(page, i, items){
return(
<div key={items.length - i}>{self.renderElement(page)}</div>
);
})
React然后说:“哦,一 开始 有个新项目,我应该在那儿插入一个节点”,每个人都很高兴。结束。
假设我有: 我如何使它最终具有SMTH1行量,每个行包含SMTH2列量?
我是冬眠新手,不会RTFM,所以我希望有人能帮我节省很多时间。 我的数据库中的对象之间有多对多的关系。假设员工和工作。 我想选择分配给给定员工的所有作业。我的对象乔布斯有一个正在处理它的所有员工的列表。所以,在java中,它应该是:作业job.employees.contains(员工)。除了我需要把它变成一个Hibernate查询什么的。 现在,我在选择所有东西后,正在Java中使用蛮力。 如何
问题内容: 我觉得我花了很多时间用Python编写代码,但没有足够的时间来创建Pythonic代码。最近,我遇到了一个有趣的小问题,我认为这可能是一个简单而惯用的解决方案。简而言之,我需要收集列表中的每个顺序对。例如,给定列表,我想计算。 当时我想出了一个快速的解决方案,看起来像翻译过的Java。再问这个问题,我能做的最好的就是 在长度不均的情况下,这会产生丢掉最后一个数字的副作用。 我是否缺少一
问题内容: 我对如何在Java中执行此操作有一般的想法,但是我正在学习Python,但不确定如何执行。 我需要实现一个函数,该函数返回一个包含列表中所有其他元素的列表,从第一个元素开始。 到目前为止,我不确定从这里开始该怎么做,因为我只是在学习Python中的for循环是如何不同的: 问题答案:
问题内容: 更新待办事项中的对象的最佳方法是什么?我尝试通过它进行映射,但是它没有返回任何错误。 码: 问题答案: 您不会在体内返回任何内容,如果您不返回任何内容,则默认情况下它将返回。 用这个: 或者,您也可以这样编写它,而无需使用: 注意: 我们不能直接渲染任何内部,因为date是一个对象,因此您需要使用或任何其他方法将其转换为。 查看待办事项示例: 查看此代码段以了解:
我需要正确地(没有硬代码)定位h1元素使用网格,css或Flex。所有这些元素都存储在大小相等的列中。在一行中。当屏幕变小时,我需要将element1和element2放在h1测试的下面。任务的细节不允许在css中为各种屏幕扩展使用@media。因此,我在这里写作,因为我不明白如何做到这一点。 我需要元素的这个位置