gpt4 book ai didi

javascript - 当我从开头删除元素时,为什么 m.render() 不更新 View ?

转载 作者:行者123 更新时间:2023-12-01 02:59:23 26 4
gpt4 key购买 nike

在这里,我试图更新文档以包含许多元素,并且我正在逐步删除这些元素。我尝试了两种方法,一种不涉及创建 m-objects,另一种是我在每个 m.render() 上创建新的 m-objects 。我在程序中使用了第一种方法,但它不起作用,所以我决定测试 Mithril 并发现了这种行为。

这不起作用:

e1 = m('i', 'e1');
e2 = m('i', 'e2');
e3 = m('i', 'e3');
m.render(document.body, m('b', [e1, e2, e3]));
// "e1e2e3" appears
m.render(document.body, m('b', [e2, e3]));
// "e2e3" appears
m.render(document.body, m('b', [e3]));
// "e2e3" appears
m.render(document.body, m('b', []));
// "e2e3" appears

有趣的是,如果我从末尾删除项目,它会起作用:

e1 = m('i', 'e1');
e2 = m('i', 'e2');
e3 = m('i', 'e3');
m.render(document.body, m('b', [e1, e2, e3]));
// "e1e2e3" appears
m.render(document.body, m('b', [e1, e2]));
// "e1e2" appears
m.render(document.body, m('b', [e1]));
// "e1" appears
m.render(document.body, m('b', []));
// "" appears

并且,此方法始终有效(双向):

m.render(document.body, m('b', [m('i', 'e1'), m('i', 'e2'), m('i', 'e3')]));
// "e1e2e3" appears
m.render(document.body, m('b', [m('i', 'e2'), m('i', 'e3')]));
// "e2e3" appears
m.render(document.body, m('b', [m('i', 'e3')]));
// "e3" appears
m.render(document.body, m('b', []));
// "" appears

我想我可以在程序中使用最后一个方法,但我想知道为什么原来的方法不起作用。

最佳答案

使用键:https://mithril.js.org/keys.html

当您处理可能会更改(重新排序或添加/删除项目)的数据列表时,最好为与其呈现的数据相关的每个组件/元素设置一个

我不太确定 Mithril 在这里做了什么,但如果没有 key ,它就无法正确识别每次删除哪些 child 。 (从列表末尾删除时,它更常见。)

但是,只要使用正确的键,它总是有效的:

var children = [
m('i', {key: 'e1'}, 'e1'),
m('i', {key: 'e2'}, 'e2'),
m('i', {key: 'e3'}, 'e3')
];

function show() {
m.render(document.body, m('b', {onclick: removeFirst}, children));
}

function removeFirst() {
children = children.slice(1);
console.log('children', children);
show();
}

show();
<body>
<script src="https://unpkg.com/mithril/mithril.js"></script>
<script src="index.js"></script>
</body>

关于javascript - 当我从开头删除元素时,为什么 m.render() 不更新 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46542250/

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