이 기사는 vuejs의 목록 렌더링에 대한 자세한 소개를 제공합니다. 이는 특정 참조 가치가 있으므로 도움이 될 수 있습니다.
배열을 요소 집합에 대응시키기 위해 v-for 사용
v-for 명령어를 사용하여 다음을 기반으로 연산을 수행합니다. 배열 세트의 옵션 목록이 렌더링됩니다. v-for 지시문에는 항목의 양식 항목에 대한 특수 구문이 필요합니다. 여기서 항목은 소스 데이터 배열이고 항목은 배열 요소를 반복하기 위한 별칭입니다.
<ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li> </ul> var example1 = new Vue({ el: '#example-1', data: { items: [ { message: 'Foo' }, { message: 'Bar' } ] } })
v-for에서는 상위 범위 속성 권한에 대한 전체 액세스 권한이 있습니다. v-for는 현재 항목의 인덱스인 선택적 두 번째 매개변수도 지원합니다.
<ul id="example-2"> <li v-for="(item, index) in items"> {{ parentMessage }} - {{ index }} - {{ item.message }} </li> </ul> var example2 = new Vue({ el: '#example-2', data: { parentMessage: 'Parent', items: [ { message: 'Foo' }, { message: 'Bar' } ] } })
in 대신 of를 구분 기호로 사용할 수도 있습니다. 왜냐하면 그가 가장 가깝기 때문입니다. javascript Iterator 구문
<p v-for="item of items"></p>
객체의 v-for
v-for를 사용하여 객체의 속성을 반복할 수도 있습니다.
<ul id="v-for-object" class="demo"> <li v-for="value in object"> {{ value }} </li> </ul> new Vue({ el: '#v-for-object', data: { object: { firstName: 'John', lastName: 'Doe', age: 30 } } })
두 번째 매개변수를 키 이름으로 제공할 수도 있습니다
# 🎜 🎜#<p v-for="(value, key) in object"> {{ key }}: {{ value }} </p>세 번째 매개변수는 색인입니다.
#🎜🎜 # <p v-for="(value, key, index) in object">
{{ index }}. {{ key }}: {{ value }}
</p>
객체를 순회할 때 Object.key()의 결과에 따라 순회하지만 다른 자바스크립트에서도 결과가 일관된다는 보장은 없습니다.
key
vue.js가 v-for를 사용하여 렌더링된 요소 목록을 업데이트하는 경우 기본값은 "내부 재사용" 전략입니다. 데이터 항목의 순서가 변경된 경우. Vue는 데이터 항목의 순서와 일치하도록 DOM 요소를 이동하지 않지만 단순히 각 요소를 재사용하고 특정 인덱스에서 렌더링된 각 요소를 표시하는지 확인합니다. 이는 vue1.x의 track-by="$index"와 유사합니다.
이 기본 모드는 효율적이지만 하위 구성 요소 상태 또는 임시 DOM 상태(예: 양식 입력 값)에 의존하지 않는 목록 렌더링 출력에만 적합합니다.
Vue가 각 노드의 ID를 추적하여 기존 요소를 재사용하고 재정렬할 수 있도록 힌트를 제공하려면 각 항목에 고유한 키 속성을 제공해야 합니다. 이상적인 키 값은 각 항목의 고유 ID입니다. 이 특수 속성은 vue1.x의 track-by와 동일하지만 속성처럼 작동하므로 값을 동적으로 바인딩하려면 v-bind를 사용해야 합니다.
<p v-for="item in items" :key="item.id">
<!-- 内容 -->
</p>
최대한 v-for 사용 시 키를 제공하는 것이 좋습니다, 출력 DOM을 통과하지 않는 한 내용은 매우 간단하거나 기본 동작을 사용하여 성능을 향상시킬 수 있습니다.
Vue가 노드를 식별하는 일반적인 메커니즘이기 때문에 키는 특별히 v-for와 관련이 없으며 키에는 다른 용도도 있습니다.
배열 업데이트 감지#🎜🎜 #
컴파일된 메서드
vue에는 항상 배열을 관찰하는 컴파일된 메서드가 포함되어 있으므로 뷰 업데이트도 트리거합니다.
* push()————배열로
# 🎜🎜#* pop()————배열 없음
* Shift()————#🎜🎜 ## 🎜🎜#
* unshift()
* splice( )————배열 분할
* sort()————배열 정렬# 🎜🎜#
* reverse()————배열 뒤집기
배열 바꾸기#🎜 🎜#Mutation 메소드는 이러한 메소드에 의해 호출된 원래 배열을 변경합니다. 대조적으로, 돌연변이가 아닌 방법도 있습니다. 예: filter(), concat() 및 Slice(). 이것은 원래 배열을 변경하지 않지만 항상 새 배열을 반환합니다. non-mutation 방법을 사용하는 경우 기존 배열을 새 배열로 교체할 수 있습니다
example1.items = example1.items.filter(function (item) { return item.message.match(/Foo/) })#🎜🎜 #이렇게 하면 vue가 기존 DOM을 삭제하고 전체 목록을 다시 렌더링하게 될 것이라고 생각할 수도 있습니다. 다행히도 그렇지 않습니다. Vue는 DOM 요소의 재사용을 극대화하기 위해 몇 가지 스마트하고 경험적인 방법을 구현했기 때문에 원래 배열을 동일한 요소가 포함된 배열로 바꾸는 것은 매우 효율적인 작업입니다. Notes
JavaScript 제한으로 인해 vue는 다음과 같은 변경된 배열을 감지할 수 없습니다1. 인덱스를 사용하여 항목을 직접 설정할 때, 예: vm.items[indexOfItem] = newValue
2. 배열의 길이를 수정하는 경우: 예: vm.items.length = newLength#🎜 🎜## 🎜🎜#var vm = new Vue({ data: { items: ['a', 'b', 'c'] } }) vm.items[1] = 'x' // 不是响应性的 vm.items.length = 2 // 不是响应性的첫 번째 유형의 문제를 해결하기 위해 다음 두 가지 방법을 사용하면 vm.items[indexOfItem] =와 동일한 효과를 얻을 수 있습니다. newValue이며 상태 업데이트도 트리거합니다
// Vue.set Vue.set(vm.items, indexOfItem, newValue) // Array.prototype.splice vm.items.splice(indexOfItem, 1, newValue)
你也可以使用vm.$set实例方法,该方法是全局方法vue.set的一个别名
vm.$set(vm.items, indexOfItem, newValue)
为了解决第二类问题,你可以使用splice
vm.items.splice(newLength)
splice()方法向/从数组添加/删除项目,然后返回被删除的项目
arrayObject.splice(index,howmany,item1,.....,itemX)
index
必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany
必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX
可选。向数组添加的新项目。
对象更改检测注意事项
还是由于javascript的限制,vue不能检测对象属性的添加或删除
var vm = new Vue({ data: { a: 1 } }) // `vm.a` 现在是响应式的 vm.b = 2 // `vm.b` 不是响应式
对于已经创建的实例,vue不能动态添加跟级别的响应式属性。但是,可以使用 Vue.set(object, key, value)方法向嵌套对象添加响应式属性。
var vm = new Vue({ data: { userProfile: { name: 'Anika' } } })
你可以添加一个age属性到嵌套的userProfile对象:
Vue.set(vm.userProfile, 'age', 27)
你还可以使用vm.$set实例方法,他只是全局vue.set的别名
vm.$set(vm.userProfile, 'age', 27)
有事你可能需要为已有对象赋予多个新属性,比如使用 Object.assign() 或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:
Object.assign(vm.userProfile, { age: 27, favoriteColor: 'Vue Green' }) 你应该这样: vm.userProfile = Object.assign({}, vm.userProfile, { age: 27, favoriteColor: 'Vue Green' })
显示过滤/排序结果
有事,我们想要显示一个数组的过滤或排序副本,而不实际改变 或重置原始数据。在这种情况下,可以创建返回过滤或排序 数组的计算属性。
<li v-for="n in evenNumbers">{{ n }}</li> data: { numbers: [ 1, 2, 3, 4, 5 ] }, computed: { evenNumbers: function () { return this.numbers.filter(function (number) { return number % 2 === 0 }) } }
在计算属性不使用的情况下,(例如,在嵌套v-for循环中)你可以使用method方法。
data: { numbers: [ 1, 2, 3, 4, 5 ] }, methods: { even: function (numbers) { return numbers.filter(function (number) { return number % 2 === 0 }) } }
一段取值范围的v-for
v-for也可以取整数。在这种情况下 ,它将重复多刺激模板。
<p> <span v-for="n in 10">{{ n }} </span> </p>
v-for on a d477f9ce7bf77f53fbcf36bec1b69b7a
类似于v-if,你也可以利用带有v-for的d477f9ce7bf77f53fbcf36bec1b69b7a渲染多个元素。
<ul> <template v-for="item in items"> <li>{{ item.msg }}</li> <li class="pider" role="presentation"></li> </template> </ul>
v-for with v-if
当他们处于同一节点,v-for的优先级比v-if更高,这意味着v-if将分别重复运行与每个v-for循环中。当你想为仅有的一些项渲染节点时,这种优先级的机制会十分有用。
<li v-for="todo in todos" v-if="!todo.isComplete"> {{ todo }} </li>
上面的代码只传递了未完成的 todos。
而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 d477f9ce7bf77f53fbcf36bec1b69b7a)上。如:
<ul v-if="todos.length"> <li v-for="todo in todos"> {{ todo }} </li> </ul> <p v-else>No todos left!</p>
一个组件的v-for
了解组件相关知识,查看组件。完全可以先跳过他,以后再回来 查看。
在自定义组件里,你可以像任何普通元素一样用v-for.
<my-component v-for="item in items" :key="item.id"></my-component>
当在组件中使用 v-for 时,key 现在是必须的。
然而,任何数据都不会被自动传递到组件里,因为组件有自己独立的作用域。为了把迭代数据传递到组件里。
我们要用props:
<my-component v-for="(item, index) in items" v-bind:item="item" v-bind:index="index" v-bind:key="item.id" ></my-component>
不自动将item注入到组件里的原因是,这会使得组件与v-for的运作紧密耦合。明确组件数据的来源能够使组件在其他场合重复使用。
<p id="todo-list-example"> <form v-on:submit.prevent="addNewTodo"> <label for="new-todo">Add a todo</label> <input v-model="newTodoText" id="new-todo" placeholder="E.g. Feed the cat" > <button>Add</button> </form> <ul> <li is="todo-item" v-for="(todo, index) in todos" v-bind:key="todo.id" v-bind:title="todo.title" v-on:remove="todos.splice(index, 1)" ></li> </ul> </p>
注意这里的is="todo-item"属性。这种做法在使用dom模板时是十分必要的。因为在ff6d136ddc5fdfeffaf53ff6ee95f185元素内只有25edfb22a4f469ecb59f1190150159c6元素 会被看做有效内容。这样做实现的效果与c20b531f5b99ef8837ce29ced08ba7cd相同。但是可以避开一些潜在的浏览器解析错误。
<p id="todo-list-example"> <form v-on:submit.prevent="addNewTodo"> <label for="new-todo">Add a todo</label> <input v-model="newTodoText" id="new-todo" placeholder="E.g. Feed the cat" > <button>Add</button> </form> <ul> <li is="todo-item" v-for="(todo, index) in todos" v-bind:key="todo.id" v-bind:title="todo.title" v-on:remove="todos.splice(index, 1)" ></li> </ul> </p>
注意这里的 is="todo-item" 属性。这种做法在使用 DOM 模板时是十分必要的,因为在 ff6d136ddc5fdfeffaf53ff6ee95f185 元素内只有 25edfb22a4f469ecb59f1190150159c6 元素会被看作有效内容。这样做实现的效果与 c20b531f5b99ef8837ce29ced08ba7cd 相同,但是可以避开一些潜在的浏览器解析错误。查看 DOM 模板解析说明 来了解更多信息。
Vue.component('todo-item', { template: '\ <li>\ {{ title }}\ <button v-on:click="$emit(\'remove\')">Remove</button>\ </li>\ ', props: ['title'] }) new Vue({ el: '#todo-list-example', data: { newTodoText: '', todos: [ { id: 1, title: 'Do the dishes', }, { id: 2, title: 'Take out the trash', }, { id: 3, title: 'Mow the lawn' } ], nextTodoId: 4 }, methods: { addNewTodo: function () { this.todos.push({ id: this.nextTodoId++, title: this.newTodoText }) this.newTodoText = '' } } })
相关推荐:
jQuery中的方法有哪些?jQuery中常用的方法(附代码)
위 내용은 vuejs의 목록 렌더링에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!