我们用到了VUE中的v-for、v-on、v-model三种指令
下面我谈一下现阶段对这三个指令的理解
v-for
<li v-for = 'item in list'>{{item}}</li>
我对v-for的理解就是VUE中的for循环,例如item in list就和C语言中的for i in range有异曲同工之意。
v-on
<button v-on:click = "handleBtnClick">提交</button>
v-on用来绑定事件,上边就是给button绑定了一个点击事件
v-model
<input type="text" v-model = "inputvalue"/>
V-model实质上就是双向绑定,把输入框中的值与inputvalue中的值绑定以来,一方改变双方都改变
TodoList的实现代码如下,现在只实现了添加功能,后期会一一实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TodoList</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model = "inputvalue"/>
<button v-on:click = "handleBtnClick">提交</button> <!--v-on用来绑定事件-->
<ul>
<li v-for = 'item in list'>{{item}}</li> <!--v-for类似于for循环-->
</ul>
</div>
<script>
var app = new Vue({
el:'#app',
data:{
list:[],
inputvalue:''
},
methods:{
handleBtnClick:function(){
this.list.push(this.inputvalue) //像list中添加button提交的值
this.inputvalue = '' //每次提交完之后把输入框内的值清空
}
}
})
</script>
</body>
</html>
下边我们应用组件对Todolist进行一个优化
先是全局组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TodoList</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model = "inputvalue"/>
<button v-on:click = "handleBtnClick">提交</button> <!--v-on用来绑定事件-->
<ul>
<todo-item v-bind:content='item' v-for = "item in list">
<!-- 由于下方已经创建了全局组件,可以直接使用,但是大写字母前要加‘-’-->
<!-- 通过v-bind语法借助content变量把item的值传给下方的TodoItem子组件-->
</todo-item>
</ul>
</div>
<script>
//列表组件
Vue.component("TodoItem",{ //vue.component用来创建一个全局组件
props:['content'], //通过props接收content的值
template: " <li>{{content}}</li>"
})
var app = new Vue({
el:'#app',
data:{
list:[],
inputvalue:''
},
methods:{
handleBtnClick:function(){
this.list.push(this.inputvalue) //像list中添加button提交的值
this.inputvalue = '' //每次提交完之后把输入框内的值清空
}
}
})
</script>
</body>
</html>
再是局部组件
局部组件必须要在Vue实例中注册才能够使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TodoList</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model = "inputvalue"/>
<button v-on:click = "handleBtnClick">提交</button> <!--v-on用来绑定事件-->
<ul>
<todo-item v-bind:content='item' v-for = "item in list">
<!-- 通过v-bind语法借助content变量把item的值传给下方的TodoItem子组件-->
</todo-item>
</ul>
</div>
<script>
//局部组件
var TodoItem = {
props:['content'],
template: " <li>{{content}}</li>"
}
//Vue实例
var app = new Vue({
components:{ //局部组件需要在实例中注册才能使用
TodoItem: TodoItem
},
el:'#app',
data:{
list:[],
inputvalue:''
},
methods:{
handleBtnClick:function(){
this.list.push(this.inputvalue) //像list中添加button提交的值
this.inputvalue = '' //每次提交完之后把输入框内的值清空
}
}
})
</script>
</body>
</html>
接下来我们来完成删除功能
我在练习的过程中习惯把注释和笔记写在代码中,所以大家顺一遍我的代码也自然就懂啦
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TodoList</title>
<script src="./vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model = "inputvalue"/>
<button v-on:click = "handleBtnClick">提交</button> <!--v-on用来绑定事件-->
<ul>
<todo-item v-bind:content='item'
v-bind:index = "index"
v-for = "(item,index) in list"
@delete = 'handleItemDelete'>
<!--
通过v-bind语法借助content和index变量把item和index的值传给下方的TodoItem子组件
这里的@ 等价于 v-for
-->
</todo-item>
</ul>
</div>
<script>
//局部组件
var TodoItem = {
props:['content','index'],
template: " <li @click = 'handleItemClick'>{{content}}</li>", //给li绑定点击事件
methods:{
handleItemClick:function(){
this.$emit("delete",this.index); //通过$emit向外触发delete事件并传出index到父组件
}
}
}
//Vue实例
var app = new Vue({
components:{ //局部组件需要在实例中注册才能使用
TodoItem: TodoItem
},
el:'#app',
data:{
list:[],
inputvalue:''
},
methods:{
//提交事件
handleBtnClick:function(){
this.list.push(this.inputvalue) //像list中添加button提交的值
this.inputvalue = '' //每次提交完之后把输入框内的值清空
},
//点击删除事件
handleItemDelete:function(index){
this.list.splice(index,1) //从index开始向后删除一项
}
}
})
</script>
</body>
</html>