一、组件的概念
- 标签中属性和数据绑定:v-bind
<button v-on:click="handleAdditem" v-bind:title="inputValue">增加</button>
二、拆分todoList组件
- 将列表拆出来
1)定义一个变量app,将createApp的实例赋值给它
const app = Vue.createApp({
data() {
return {
inputValue: '',
list: []
}
},
methods: {
handleAdditem() {
this.list.push(this.inputValue)
this.inputValue = ''
}
},
template: `
<div>
<input v-model="inputValue"/>
<button v-on:click="handleAdditem" v-bind:title="inputValue">增加</button>
<ul>
<li v-for="(item, index) of list">{{item}}-{{index}}</li>
</ul>
</div>
`
}).mount('#root')
2)用app注册组件,名叫todo-item:
app.component('todo-item', {
data() {
return {
item: 'hello'
}
},
template: '<div>{{item}}</div>'
})
3)改写原template中列表的展示,改为展示组件todo-item
template: `
<div>
<input v-model="inputValue"/>
<button v-on:click="handleAdditem" v-bind:title="inputValue">增加</button>
<ul>
<todo-item v-for="(item, index) of list" />
</ul>
</div>
`
4)将app挂载到root上,将原来的挂载去掉
app.mount('#root')
5)想显示list循环出来的数据,可用v-bind绑定属性去展示:
<ul>
<todo-item v-for="item of list" v-bind:content="item"/>
</ul>
接着在组件中用props属性去接收
app.component('todo-item', {
props: ['content'],
template: '<li>{{content}}</li>'
})
完整代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>4s</title>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="root"></div>
<script>
const app = Vue.createApp({
data() {
return {
inputValue: '',
list: []
}
},
methods: {
handleAdditem() {
this.list.push(this.inputValue)
this.inputValue = ''
}
},
template: `
<div>
<input v-model="inputValue"/>
<button v-on:click="handleAdditem" v-bind:title="inputValue">增加</button>
<ul>
<todo-item v-for="item of list" v-bind:content="item"/>
</ul>
</div>
`
});
app.component('todo-item', {
props: ['content'],
template: '<li>{{content}}</li>'
})
app.mount('#root')
</script>
</body>
</html>