v-for 循环项不会在 Vue 中立即更新
v-for loop items not immediately updating in Vue
我会逐点解释,因为它可能是一个安静的复杂。
我用鼠标或触控板突出显示文本,然后在鼠标上移时突出显示的文本存储在对象数组中。每个对象都包含选定的文本。
我希望在该数组上循环,以便能够一一显示所有选择,只要我选择不同的文本即可。
基本上,我将每个选定的文本存储到 selectionArray。每个 selectedText 都是一个对象内的字符串。所以 SelectionArray 变成了这样的对象数组 在第一次选择时:
[
{selectedText: '...string...'}
]
在第二次选择时更新数组:
[
{selectedText: '...string...'},
{selectedText: '...another string...'}
]
等等...
最后,我在等于 selectionArray 的 items 数组上使用 v-on 循环
与:
this.items = selectionArray
目前我快到了,但缺少一些东西,因为我没有看到实时修改我必须对 HTML(奇怪)进行无用的修改,例如才能看到结果。我怀疑创建的方法,但我需要帮助,请至少以逻辑方式进行调查。谢谢
代码如下:
<template>
<main class='wrapper'>
<section class='wrapper-copy'>
<div class='copy'>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Omnis sequi dolorum soluta pariatur asperiores. Recusandae atque nesciunt ipsa velit impedit fugit enim, quia explicabo adipisci sunt earum laudantium illo. Tenetur.
Animi magnam corrupti atque mollitia eaque enim, voluptatum magni laboriosam vel possimus reprehenderit aut doloribus inventore repellat aliquam voluptatem esse ut saepe at iusto qui quibusdam doloremque exercitationem ipsam. Dicta.
In animi nobis accusamus nemo repellat dicta a repellendus provident accusantium fugit voluptas minus laudantium reiciendis cumque, amet porro maiores quisquam? Ullam aut voluptatem delectus cum rerum perferendis vero laudantium!
</div>
</section>
<article class="wrapper-select">
<div class="select">
<div id='input'
class='selected-copy'
v-for='(item, index) in items'
:key='item.index'>
<div class='index'>{{ index }} </div>
<p class='selection'> {{ item.selectedText }} </p>
</div>
</div>
</article>
</main>
</template>
<script>
export default {
name: 'app',
data () {
return {
items: []
}
},
created () {
var selectionArray = []
function storeSelection () {
var selectedText = window.getSelection().toString()
if (selectedText.length && selectionArray.indexOf(selectedText) === -1) {
selectionArray[selectionArray.length] = {selectedText}
}
console.log(selectionArray)
}
document.addEventListener('mouseup', storeSelection)
this.items = selectionArray
console.log(this.items)
}
}
</script>
Vue 无法检测 addition/deletion 的数组项和对象属性。阅读 Vue 指南的 Caveats 部分,它为您提供了一些关于如何解决该问题的想法。
内容如下:
由于 JavaScript 中的限制,Vue 无法检测到数组的以下更改:
- 当您直接使用索引设置项目时,例如vm.items[indexOfItem] = 新值
- 当您修改数组的长度时,例如vm.items.length = newLength
为了克服警告 1,以下两项将实现与 vm.items[indexOfItem] = newValue 相同的效果,但也会触发反应系统中的状态更新:
// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)
要处理caveat 2,可以使用splice:
example1.items.splice(newLength)
我会逐点解释,因为它可能是一个安静的复杂。
我用鼠标或触控板突出显示文本,然后在鼠标上移时突出显示的文本存储在对象数组中。每个对象都包含选定的文本。
我希望在该数组上循环,以便能够一一显示所有选择,只要我选择不同的文本即可。
基本上,我将每个选定的文本存储到 selectionArray。每个 selectedText 都是一个对象内的字符串。所以 SelectionArray 变成了这样的对象数组 在第一次选择时:
[
{selectedText: '...string...'}
]
在第二次选择时更新数组:
[
{selectedText: '...string...'},
{selectedText: '...another string...'}
]
等等... 最后,我在等于 selectionArray 的 items 数组上使用 v-on 循环 与:
this.items = selectionArray
目前我快到了,但缺少一些东西,因为我没有看到实时修改我必须对 HTML(奇怪)进行无用的修改,例如才能看到结果。我怀疑创建的方法,但我需要帮助,请至少以逻辑方式进行调查。谢谢
代码如下:
<template>
<main class='wrapper'>
<section class='wrapper-copy'>
<div class='copy'>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Omnis sequi dolorum soluta pariatur asperiores. Recusandae atque nesciunt ipsa velit impedit fugit enim, quia explicabo adipisci sunt earum laudantium illo. Tenetur.
Animi magnam corrupti atque mollitia eaque enim, voluptatum magni laboriosam vel possimus reprehenderit aut doloribus inventore repellat aliquam voluptatem esse ut saepe at iusto qui quibusdam doloremque exercitationem ipsam. Dicta.
In animi nobis accusamus nemo repellat dicta a repellendus provident accusantium fugit voluptas minus laudantium reiciendis cumque, amet porro maiores quisquam? Ullam aut voluptatem delectus cum rerum perferendis vero laudantium!
</div>
</section>
<article class="wrapper-select">
<div class="select">
<div id='input'
class='selected-copy'
v-for='(item, index) in items'
:key='item.index'>
<div class='index'>{{ index }} </div>
<p class='selection'> {{ item.selectedText }} </p>
</div>
</div>
</article>
</main>
</template>
<script>
export default {
name: 'app',
data () {
return {
items: []
}
},
created () {
var selectionArray = []
function storeSelection () {
var selectedText = window.getSelection().toString()
if (selectedText.length && selectionArray.indexOf(selectedText) === -1) {
selectionArray[selectionArray.length] = {selectedText}
}
console.log(selectionArray)
}
document.addEventListener('mouseup', storeSelection)
this.items = selectionArray
console.log(this.items)
}
}
</script>
Vue 无法检测 addition/deletion 的数组项和对象属性。阅读 Vue 指南的 Caveats 部分,它为您提供了一些关于如何解决该问题的想法。
内容如下:
由于 JavaScript 中的限制,Vue 无法检测到数组的以下更改:
- 当您直接使用索引设置项目时,例如vm.items[indexOfItem] = 新值
- 当您修改数组的长度时,例如vm.items.length = newLength
为了克服警告 1,以下两项将实现与 vm.items[indexOfItem] = newValue 相同的效果,但也会触发反应系统中的状态更新:
// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)
要处理caveat 2,可以使用splice:
example1.items.splice(newLength)