vue3.0混合API的使用,二

vue2.x存在的问题

在vue2.x中,对一个功能模块的处理一般是将数据定义在data中,方法定义在methods。如果这个页面内容方法过多,就不太利于代码阅读和维护。

vue3.0推出使用混合API

在vue3.0中,可以使用setup函数,将变量和方法都写在这个函数中,还可以将这个功能模块抽离到另一个js文件中,增加了代码的可阅读性,让别人知道你这个js文件的作用。在后面可能出现bug,也有利于他人维护。

在使用setup函数时,先介绍2个新的属性refreactive。

ref:监听简单数据类型的改变。

reactive:监听符合类型数据的改变。

Demo

这里以一个展示用户、新增用户、删除用户为例

vue界面

<template>
  <div>
    <form>
      <input type="text" v-model="state2.users.id" />
      <input type="text" v-model="state2.users.name" />
      <input type="submit" @click="addUser" />
    </form>
    <ul v-for="(item, index) in state.userInfo" :key="index">
      <li @click="removeUser(index)">{{ item.id }}--{{ item.name }}</li>
    </ul>
  </div>
</template>

<script>
import { reactive } from "vue";
import UserController from './UserController.js';
export default {
  setup() {
    let state = reactive({
      userInfo: [
        { id: 1, name: "张三" },
        { id: 2, name: "李四" },
        { id: 3, name: "王五" },
      ],
    });
    let state2 = reactive({
      users: {
        id: "",
        name: "",
      },
    });
    let { removeUser, addUser } = UserController(state, state2);
    return { state, state2, removeUser, addUser };
  },
};
</script>

被单独抽离出的js文件(UserController)

function UserController(state, state2) {
    function removeUser(index) {
        state.userInfo = state.userInfo.filter((item, i) => i !== index);
    }
    function addUser(e) {
        e.preventDefault();
        const user = Object.assign({}, state2.users);
        state.userInfo.push(user);
        state2.users.id = "";
        state2.users.name = "";
    }
    return { removeUser, addUser };
}
export default UserController;

这样抽离出来后,阅读user相关功能模块就只需关注UserController这个js文件即可。

混合API实质

混合API实质其实也是将在setup中return的时候注入到data和methods中。

setup注意点

setup函数执行时机:setup是在beforecreate前插入,而data和methods是在created之后才挂载到vue实例中,因此在setup中是无法使用data和methods的。

setup函数中的this:因为无法使用data和methods所以setup为了避免错误使用this,直接将this赋undifined。

setup函数中无法使用异步函数,也就是无法在setup前面加入async。