这个问题有点啰嗦,但我希望你明白究竟发生了什么......
我正在构建一个任务管理器桌面应用程序(Electron)供我们公司使用,我发生了一个奇怪的行为。任务管理器是6列(每个员工一列),包含要完成的任务的垂直列表。它包括拖放功能,因此您可以对任务进行排序。
我正在使用Dragula来处理拖放部分,然后按从上到下的顺序收集所有任务的ID号,并将它们存储在一个数组中。
我正在使用PouchDB更新数据库并同步其他正在运行的应用程序。
对于Dragula / PouchDB端,我使用以下代码:
var containers = [];
containers.push(ReactDOM.findDOMNode(this.refs.taskContainer));
var drake = Dragula(containers);
drake.on('drop', function(el, target, source, sibling) {
// Get Desired Order of IDs
for(i = 0; i < source.children.length; i++) {
ids.push(source.children[i].id);
}
// Loop through IDs, write an "order" to tasks in PouchDB Database ("TaskData").
// TaskData's replication is "live" so it automatically syncs to the DB.
for(i = 0; i < ids.length; i++) {
TaskData.get(ids[i]).then(function(doc) {
doc.order = ids.indexOf(doc._id);
TaskData.put(doc).catch(function(err) {
console.log(err);
});
});
}
});
此时,我的TaskData现在有一个新的“order”键,带有所需的值。 现在,我需要渲染ReactJS组件 - 按顺序 。
从道具中获取任务(从TaskData刷新)并过滤掉所需内容:
var tasks = this.props.tasks.filter(function(task) {
if(task.archive !== 1) {
return true
}
});
然后我按照上面提到的订单号(使用lodash.js)对任务进行排序,并将排序后的数据映射到React Components:
tasks = _.sortBy(tasks, 'order').map(function(task) {
return <Task key={task.id} order={task.order} ...more props />
});
很好,我的任务按顺序呈现,一切看起来都很好。
现在,问题是......
当我拖放以将任务从["1", "2", "3", "4"]
重新排序为["4", "1", "2", "3"]
时,我实际上得到了["3", "4", "1", "2"]
。任务移动和更新(因为上面的Dragula / PouchDB代码)。很奇怪......我输入了Dev Tools location.reload()
,令我惊讶的是,这些任务现在按照我最初的要求排序:["4", "1", "2", "3"]
。
再次尝试,我将任务从["1", "2", "3", "4"]
移至["1", "3", "2", "4"]
,任务重置为["1", "2", "3", "4"]
。同样,location.reload()
和任务现已订购:["1", "3", "2", "4"]
。
在尝试调试时,我发现如果我禁用_.sortBy
函数,那么任务在被删除后会保持不变(尽管它们在开始时是不正常的)。任务移动到所需位置并具有所需的订单号。
我还发现,如果我禁用PouchDB .put()
并保持_.sortBy
正常工作,它也可以工作,但数据不会写入服务器,订单号也不会因此更新。
也许我刚刚盯着代码太长时间,但我无法弄清楚为什么这些任务正在蹦蹦跳跳。有人有什么想法吗?
感谢您的帮助!
答案 0 :(得分:0)
我通过实施uuid
设法使我的工作成为现实。以下是以下代码段:
// Import the code
import uuid from 'uuid';
// My dummy component
<Messages>
<ul>
{messages.map(({ value, signature }) => (
<Message
value={value}
key={uuid.v4()} // use the uuid as the unique key
from={signature}
onMessageRecieved={this.handleMessageRecieved} />
))}
</ul>
</Messages>
查看这些说明,以获取有关实现的更多信息。 https://survivejs.com/react/getting-started/implementing-notes/
对@Alf表示敬意this link。帮助我解决了问题,请参见@Dmitri Zaitsev's答案。
快乐编码=)