Vue从入门到实战:v-for和v-if一起使用的替代方案

来自CloudWiki
跳转至: 导航搜索

将v-for和v-if一起使用,在渲染列表时,根据v-if指令的条件判断来过滤列表中不满足条件的列表项。


v-for和v-if一起使用

实际上,这个功能也可以使用计算属性来完成。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>v-for与计算属性</title>
	</head>
	<body>
		<div id="app">
		  <h1>已完成的工作计划</h1>
			<ul>
				<li v-for="plan in completedPlans">
					{{plan.content}}
				</li>
			</ul>
			<h1>未完成的工作计划</h1>
			<ul>
				<li v-for="plan in incompletePlans">
					{{plan.content}}
				</li>
			</ul>
		</div>
	
		<script src="vue.js"></script>
		<script>
			var vm = new Vue({
			  el: '#app',
			  data: {
					plans: [
						{content: '写《Vue.js无难事》', isComplete: false},
						{content: '买菜', isComplete: true},
						{content: '写PPT', isComplete: false},
						{content: '做饭', isComplete: true},
						{content: '打羽毛球', isComplete: false}
					]
				},
			  computed: {
			  	// 计算属性的 getter
			    completedPlans: function () {
			      return this.plans.filter(plan => plan.isComplete);
			    },
			    incompletePlans: function(){
			    	return this.plans.filter(plan => !plan.isComplete);
			    }
			  }
			})
		</script>
	</body>
</html>

Vue.js的作者不建议把v-for和v-if同时用在同一个元素上。

采用计算属性过滤后再遍历,可以获得如下好处:

  • 过滤后的列表只会在plan数组发生相关变化时才被重新计算,
  • 使用v-for="plan in completedPlans"之后,在渲染的时候只遍历已完成的计划,渲染更高效
  • 解耦渲染层的逻辑,可维护性更强。