Vue 简单入门 —— ToDoList
用到的Vue指令有:
v-for
v-on:click
v-model
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="./vue.v2.6.10.dev.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="inputValue"/>
<button v-on:click="handleBtnClick">提交</button>
<ul>
<li v-for="item in list">{{item}}</li>
</ul>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
list: [],
inputValue: '',
},
methods: {
handleBtnClick: function() {
if (this.inputValue.length == 0) return
this.list.push(this.inputValue)
this.inputValue = ''
}
}
})
</script>
</body>
</html>
jQuery 写法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
</head>
<body>
<div id="app">
<input id="input" type="text"/>
<button id="btn">提交</button>
<ul id="list"></ul>
</div>
<script>
function Page() {
}
$.extend(Page.prototype, {
init: function() {
this.bindEvents()
},
bindEvents: function() {
var btn = $('#btn')
btn.on('click', $.proxy(this.handleBtnClick, this))
},
handleBtnClick: function() {
var inputElem = $('#input')
var inputValue = inputElem.val()
if (inputValue.length == 0) return
var ulElem = $('#list')
ulElem.append('<li>' + inputValue + '</li>')
inputElem.val('')
}
})
var page = new Page()
page.init()
</script>
</body>
</html>
Vue 全局组件 写法
Vue.component() 创建出一个全局组件。
组件的名字叫TodoItem,注意大小写,因为实际使用的时候,却是
<todo-item v-bind:content="item" v-for="item in list"></todo-item>
通过遍历 list 获取 item,而 item 则与 TodoItem 组件内的对象 content 绑定,即为赋值。
Vue.component("TodoItem", {
props: ['content'],
template: "<li>{{content}}</li>"
})
TodoItem 组件在 props数组内标注了对象 content 的存在,然后就可以通过 {{}} 使用了。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="./vue.v2.6.10.dev.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="inputValue"/>
<button v-on:click="handleBtnClick">提交</button>
<ul>
<todo-item v-bind:content="item" v-for="item in list"></todo-item>
</ul>
</div>
<script>
Vue.component("TodoItem", {
props: ['content'],
template: "<li>{{content}}</li>"
})
var app = new Vue({
el: '#app',
data: {
list: [],
inputValue: '',
},
methods: {
handleBtnClick: function() {
if (this.inputValue.length == 0) return
this.list.push(this.inputValue)
this.inputValue = ''
}
}
})
</script>
</body>
</html>
Vue 局部组件 写法
var TodoItem = {
props: ['content'],
template: "<li>{{content}}</li>",
}
定义一个对象就是定义一个局部组件,和全部组件不同的是,你需要在 Vue 实例里面将这个组件注册,不然是没有效果的。
components: {
TodoItem: TodoItem,
},
注册组件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="./vue.v2.6.10.dev.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="inputValue"/>
<button v-on:click="handleBtnClick">提交</button>
<ul>
<todo-item v-bind:content="item" v-for="item in list"></todo-item>
</ul>
</div>
<script>
var TodoItem = {
props: ['content'],
template: "<li>{{content}}</li>",
}
var app = new Vue({
el: '#app',
components: {
TodoItem: TodoItem,
},
data: {
list: [],
inputValue: '',
},
methods: {
handleBtnClick: function() {
if (this.inputValue.length == 0) return
this.list.push(this.inputValue)
this.inputValue = ''
}
}
})
</script>
</body>
</html>
Vue 局部组件 写法,并且点击显示内容将其删除(子组件向父组件传值)
子组件 TodoItem 在 handleItemClick 方法被触发的时候,调用
this.$emit('delete', this.index)
向上一级发送信息。
<todo-item v-bind:content="item" v-bind:index="index" v-for="(item, index) in list" @delete="handleItemDelete"></todo-item>
父组件通过监听子组件的 delete 信息,一旦收到信息就执行 handleItemDelete 方法:
@delete="handleItemDelete"
缩写:
v-bind:content="item"
v-bind:index="index"
等于
:content="item"
:index="index"
v-on:click="handleBtnClick"
v-on:delete="handleItemDelete"
等于
@click="handleBtnClick"
@delete="handleItemDelete"
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="./vue.v2.6.10.dev.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="inputValue"/>
<button v-on:click="handleBtnClick">提交</button>
<ul>
<todo-item v-bind:content="item" v-bind:index="index" v-for="(item, index) in list" @delete="handleItemDelete"></todo-item>
</ul>
</div>
<script>
var TodoItem = {
props: ['content', 'index'],
template: "<li @click='handleItemClick'>{{content}}</li>",
methods: {
handleItemClick: function() {
this.$emit('delete', this.index)
}
}
}
var app = new Vue({
el: '#app',
components: {
TodoItem: TodoItem,
},
data: {
list: [],
inputValue: '',
},
methods: {
handleBtnClick: function() {
if (this.inputValue.length == 0) return
this.list.push(this.inputValue)
this.inputValue = ''
},
handleItemDelete: function(index) {
this.list.splice(index, 1)
}
}
})
</script>
</body>
</html>