组合API
2021-04-01 本文已影响0人
唐吉柯德
今天我们就看下vue3的组合API,首先我们用vue2来实现一个todolist
<template>
<div class="page-wrapper">
<ul>
<li v-for="(item, index) in stus" @click="delStu(index)" :key="index">{{item.name}}--{{item.age}}</li>
</ul>
<div>
<input v-model="stuModel.name">
<input v-model="stuModel.age">
<button @click="addStu">addStu</button>
</div>
</div>
</template>
<script lang="js">
export default defineComponent({
name: 'vue2TodoList',
data(){
return{
stus: [
{
name: 'zs',
age: '18'
},
{
name: 'ls',
age: '19'
},
{
name: 'ww',
age: '20'
}
],
stuModel: {
name: '',
age: ''
}
}
},
methods: {
addStu(){
let newStu= Object.assign({}, this.stuModel);
this.stus.push(newStu);
this.stus.name= '';
this.stus.age= '';
},
delStu(_index){
this.stus= this.stus.filter((item, index)=> {
return index !== _index;
})
}
}
})
</script>
实现的功能如下图所示
vue2todolist.PNG
1)页面展示一个人员信息列表
2)点击列表行通过delStu删除当前点击的人员信息
3)通过下面的两个input框收集人员信息,点击addStu按钮之后,添加一条人员信息
vue2的简套路就是我们现在data中添加需要操作的数据,在methods.computed,wathch里面设置行为,这样的写法使得代码有一定的规范,但是同时也有一定的问题,那就是我们的数据和行为代码始终分离,当文件的代码越来越多,会变得难以维护,那下来我们再来看一下vue3可以怎么来实现这么一个功能
<template>
<div class="page-wrapper">
<ul>
<li v-for="(item, index) in state.stus" @click="delStu(index)" :key="index">{{item.name}}--{{item.age}}</li>
</ul>
<div>
<input v-model="stuModel.name">
<input v-model="stuModel.age">
<button @click="addStu">addStu</button>
</div>
</div>
</template>
<script lang="js">
//useAddStu
function useAddStu(state){
let stuModel= reactive({
name: '',
age: ''
})
function addStu(){
let newStu= Object.assign({}, stuModel);
state.stus.push(newStu);
stuModel.name= '';
stuModel.age= '';
}
return [stuModel, addStu]
}
//useDelStu
function useDelStu(){
let state= reactive({
stus: [
{
name: 'zs',
age: '18'
},
{
name: 'ls',
age: '19'
},
{
name: 'ww',
age: '20'
}
]
})
function delStu(_index){
state.stus= state.stus.filter((item, index)=> {
return index !== _index;
})
}
return [state, delStu]
}
import { defineComponent, reactive } from 'vue';
export default defineComponent({
name: 'vue3ToList',
setup(){
const [ state, delStu ]= useDelStu();
const [ stuModel, addStu ]= useAddStu(state);
return {
addStu,
delStu,
state,
stuModel
}
}
})
</script>
我们封装了两个函数来完成添加和删除人员的功能,而且我们的数据始终和我们的行为在一起,当然你也可以提取文件,通过模块的方式进行引入
//react hooks
const [stuList, setstuList] = useState([]);
写过 react hooks的同学是不是觉得我上面的写法似曾相识,形成一个功能相对独立,加强代码的可维护性这个应该也是react hooks设计的时候考虑的因素之一。