持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
前言
在上一篇
的文章中,我们了解了vue的toRef和setup的context参数
,本章节中将会用前面几个章节中学到的compositionAPI
知识点开发一个TodoList
。
✋🏻 在做TodoList
之前,我们要回顾一下以前用vue基础知识
写的一个TodoList
案例,通过input
输入值之后,循环list
显示出添加的值。
定义input
使用前面文章中学过的ref
方法定义一个字符串,然后和input
中的value
进行双向数据绑定.
<script>
const app = Vue.createApp({
setup(){
const { ref } = Vue
const inputValue = ref('123')
return {
inputValue
}
},
template: `
<div>
<input :value="inputValue" />
<button>提交</button>
</div>
`
});
const vm = app.mount('#root');
</script>
为了更加直观的感受input
双向绑定的方式,我们可以在input标签
上添加一个input事件
,然后在input标签
下面添加一个div标签
输出input
的值。
const app = Vue.createApp({
setup(){
const { ref } = Vue
const inputValue = ref('123')
const handleInputValueChange = (e) => {
inputValue.value = e.target.value
}
return {
inputValue,
handleInputValueChange
}
},
template: `
<div>
<input :value="inputValue" @input="handleInputValueChange" />
<div>{{inputValue}}</div>
<button>提交</button>
</div>
`
});
- 在
input标签
中定义了一个input事件
,并在setup函数
中调用这个事件方法,事件方法接收一个event
,通过event
就可以获取到input的值
,然后将inputValue的value值
修改成event中的值
即可。
📢 此处使用到的双向数据绑定方法和修改数据值的方法,都是在前面文章中学习过的ref
的用法。不了解的可以去前面文章中回顾一下哦~
定义list
input标签
已经实现了双向数据绑定,那么这个时候我们就需要将绑定的数据值push到list
中,并循环显示出来。
<script>
const app = Vue.createApp({
setup(){
// 此处定义input相关
const { ref } = Vue
const inputValue = ref('')
const handleInputValueChange = (e) => {
inputValue.value = e.target.value
}
// 此处定义list相关
const { reactive } = Vue
const list = reactive([])
const handleSubmit = () => {
list.push(inputValue.value)
}
// 将上面定义的值和方法都返回给外部
return {
inputValue,
handleInputValueChange,
list,
handleSubmit
}
},
template: `
<div>
<input :value="inputValue" @input="handleInputValueChange" />
<button @click="handleSubmit">提交</button>
<ul>
<li v-for="(item, index) in list" :key="index">{{item}}</li>
</ul>
</div>
`
});
const vm = app.mount('#root');
</script>
- 由于
list
是一个数组形式的,所以需要使用之前文章中学过的reactive
来定义数据值。 - 给按钮绑定一个点击事件,点击之后触发的方法里面将
ref
定义的inputValue
中的value
添加到list
中。 - 并将
list
和点击事件函数都返回给外部。
封装
通过完整的代码可以发现,我们将所有的值和逻辑都写在了setup
中进行return
,这样写的代码不够美观的同时亦不便后期维护。所以我们要将setup
里面的代码进行拆分和封装
。
list
首先我们对list
进行拆分和封装,在封装的时候定义了一个新的方法addItemToList
,这个方法接收外部传入的参数,将参数push到list
中,最后将list和addItemToList方法
都返回给外部。
const listRelativeEffect = () => {
const { reactive } = Vue
const list = reactive([])
const addItemToList = (item) => {
list.push(item)
}
return{
list, addItemToList
}
}
input
然后对input
进行拆分和封装,封装的内容和之前没什么区别,都是使用ref
定义inputValue
,然后将event
中的值给到inputValue
进行修改。
const inputRelativeEffect = () => {
const { ref } = Vue
const inputValue = ref('')
const handleInputValueChange = (e) => {
inputValue.value = e.target.value
}
return {
inputValue, handleInputValueChange
}
}
setup
最后在setup函数
中引用上面两个方法中return
出来的数据和方法,并重新将这些数据和方法都return
到外部。
setup(){
const {list, addItemToList} = listRelativeEffect()
const {inputValue, handleInputValueChange} = inputRelativeEffect()
return {
inputValue,
handleInputValueChange,
list,
addItemToList
}
},
疑问
❓ 在没有封装的时候,我们是通过按钮点击事件
去调用的handleSubmit方法
给list
添加inputValue
的。封装之后list
里面的addItemToList方法
需要接收一个参数进行添加,那我们该怎么去修改呢?
<button @click="() => addItemToList(inputValue)">提交</button>
我们可以在按钮点击事件
中直接写一个箭头函数
,调用addItemToList方法
的同时将inputValue
传递过去即可实现。
总结
本篇文章主要就是用前面几篇学到的compositionAPI去开发一个TodoList案例,这个案例比较简单,也是检验之前学习成果的一个小例子,大家加油💪🏻💪🏻