# Vue.observable

在前端项目中,有许多数据需要在各个组件之间进行传递共享,这时候就需要有一个状态管理工具,一般情况下,我们都会使用 Vuex ,但对于小型项目来说,就像 Vuex 官网所说:“如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex”。这时候我们就可以使用 Vue2.6 提供的新 API Vue.observable 手动打造一个 Vuex

# 提供一个简单的 demo

/* 在src下创建 observableStore 目录,在内部新建一个 index.js */
// Vue.observable demo
// 通过Vue.observable创建一个可响应的对象
import Vue from "vue";
export const observableStore = Vue.observable({
  userInfo: {},
  roleIds: [],
});

// 定义 mutations, 修改属性
export const observableMutations = {
  setUserInfo(userInfo) {
    observableStore.userInfo = userInfo;
  },
  setRoleIds(roleIds) {
    observableStore.roleIds = roleIds;
  },
};

# 在组件中使用

<template>
  <div>
    <!-- observableStore Demo -->
    {{ userInfo.name }}
  </div>
</template>
<script>
  import {
    observableStore,
    observableMutations,
  } from "@/observableStore/index";
  export default {
    data() {
      return {
        searchValue: "",
      };
    },
    computed: {
      userInfo() {
        return observableStore.userInfo;
      },
    },
    created() {
      observableMutations.setUserInfo({
        name: "peinkid",
      });
    },
  };
</script>

# Vue watch

在开发Vue项目时,我们会经常性的使用到watch去监听数据的变化,然后在变化之后做一系列操作。

# 基础用法

<template>
  <div>
    <input v-model="searchValue" />
    <input v-model="searchValue2" />
    <input v-model="formData.name" />
  </div>
</template>
<script>
  export default {
    data() {
      return {
        searchValue: "",
        searchValue2: "",
        formData: {
          name: "",
        },
      };
    },
    watch: {
      // 在值发生变化之后,调用方法
      searchValue(newValue, oldValue) {
        if (newValue !== oldValue) {
          this.loadData();
        }
      },
      searchValue2: {
        // 通过handler来监听属性变化, 初次调用 newValue为""空字符串, oldValue为 undefined
        handler(newValue, oldValue) {
          if (newValue !== oldValue) {
            this.loadData();
          }
        },
        // 配置立即执行属性
        immediate: true,
      },
      //深度监听
      formData: {
        // 需要注意,因为对象引用的原因, newValue和oldValue的值一直相等
        handler(newValue, oldValue) {
          //TODO
        },
        // 通过指定deep属性为true, watch会监听对象里面每一个值的变化
        deep: true,
      },
    },
    methods: {
      loadData() {
        //TODO
      },
    },
  };
</script>

# 使用$watch 随时监听,随时取消

export default {
  data() {
    return {
      formData: {
        name: "",
      },
    };
  },
  created() {
    this.loadData();
  },
  methods: {
    // 模拟异步请求数据
    loadData() {
      setTimeout(() => {
        // 先赋值
        this.formData = {
          name: "peinkid",
        };
        // 等数据回显,监听数据是否发生变化
        const unwatch = this.$watch(
          "formData",
          () => {
            console.log("数据发生了变化");
          },
          {
            deep: true,
          }
        );
        /* 取消watch */
        // unwatch()
      }, 1000);
    },
  },
};

我们可以在需要的时候通过this.$watch来监听数据变化。那么如何取消监听呢,上例中this.$watch返回了一个值unwatch,是一个函数,在需要取消的时候,执行unwatch()即可取消

最后更新时间: 2022-07-02 14:36