Vue全局API

1,511 阅读2分钟

filter过滤器

过滤器分为全局过滤器和局部过滤器,一般都是使用全局过滤器,filter的第一个参数为过滤器的名字,第二个参数为一个函数,用来实现过滤的逻辑,在模板中使用过滤器的名字即可,值就是该过滤器return的值。

<div id="app">
        <input type="text" v-model="num">
        <h1>当前商品价格是¥{{(num/100).toFixed(2)}}元</h1>
        <h1>当前商品价格是¥{{num|qqq(3)}}</h1>
</div>
<script>
    //全局过滤器  创造多少过滤器没有限制  但是需要放在实例之前
    Vue.filter('qqq', function(val, n = 2) {
        console.log(val);//此处的val为  | 前面的值
        return `${(val/100).toFixed(n)}元`
    })
    let vm = new Vue({
        el: '#app',
        data: {
            num: '',
        },
        methods: {

        },
    })
</script>

全局混入mixin & 局部混入mixins

我们可以在入口文件main.js中进行混入,这样就可以混入到每一个组件中。(注意:永远都是以组件本身的数据为主) 应用场景:团队合作开发的时候,会定义一些公共的状态、属性、方法,这时我们可以使用混入来进行使用。

全局混入

  Vue.mixin({
          data(){return {}},
          methods:{},
          created(){}
        })

局部混入

局部混入一般在组件中进行混入

mixins:[{methods:{}},{data(){}},{props:['']}]  

使用插件

在Vue中我们通过use对组件进行导入,如果我们不需要使用太多组件,我们还可以使用use进行按需导入

import Vue from 'vue';
import App from './App.vue';
import Vant from 'vant';
import 'vant/lib/index.css';
import '@/assets/icon.css'
Vue.use(Vant);//导入组件库
Vue.config.productionTip = false;
new Vue({
    router,
    store,
    render: h => h(App)
}).$mount('#app')

按需导入

import Vue from 'vue';
import App from './App.vue';
import {Toast,Button,From} from 'vant';//从vant 中解构出需要的组件
import 'vant/lib/index.css';
import '@/assets/icon.css'
Vue.use(Toast)
.use(Button)
.use(From);//按需导入组件
Vue.config.productionTip = false;
new Vue({
    router,
    store,
    render: h => h(App)
}).$mount('#app')

Vue.use的原理

这是Vue官方对于use的解释

image.png

    Vue.use = function (plugin) {
      <!-- thisVue -->
      const installedPlugins = (this._installedPlugins || (this._installedPlugins = [])) // 存储的已经装过的插件
      if (installedPlugins.indexOf(plugin) > -1) {
        //如果要安装的插件以前已经装过了 那么就不用再往下执行
        return this
      }
      // arguments的第一项就是 要安装的plugin
      const args = toArray(arguments, 1) // args-->[]
      args.unshift(this)// args-->[Vue]
      if (typeof plugin.install === 'function') {
        plugin.install.call(plugin, ...args)
      } else if (typeof plugin === 'function') {
        plugin.apply(null, args)
      }
      installedPlugins.push(plugin)
      return this
    } 

Keep-alive

keep-alive是用于让组件不销毁的一个标签,在Vue中只要离开组价,组件就会销毁。而用keep-alive套起来的组件则不会销毁。(注意:如果keep-alive所在的组件也被销毁,那么之前缓存的组件就会消失);另外,keep-alive不会缓存子组件中的router-view,如果想要缓存router-view渲染的组件;就需要再使用keep-alive嵌套起来。(keep-alive中的include属性代表只缓存那些组件,组件必须提供name)

例如:<keep-alive :include="['aaa']">

<template>
  <div id="app">
    <keep-alive>
      <myButton></myButton>
    </keep-alive>
  </div>
</template>

keep-alive的原理

用了一个cache对象把加载过的组件实例保存起来 用了一个keys数组 把 组件实例对应的key存起来的结合了一个 LRU算法。 LRU(Least recently used)算法 就是最近最少使用的;最近使用 永远放在最后了,需要删除的时候 删除最前的那个 keys 只要使用了哪个组件,就把这个组建的key放到数组的最后,然后若存储的key超过了 数组允许的最大长度 ,就会把数组中的第一个key删除掉,然后对应的那个组件实例也会从cache 对象中移除掉;

nextTick

在下一次DOM更新后执行这个api

Vue.nextTick(function () { // DOM 更新了 })
// 作为一个 Promise 使用 
Vue.nextTick().then(function () { // DOM 更新了 })

nextTick原理

异步 + 发布订阅模式 异步能用微任务就是用微任务 用不了再去使用宏任务 微任务: 先试着用Promise 用不了再试着用OberserMutation 还不能用 那就不能使用微任务了 改用宏任务 先试着用setImmediate 都不可以的话 再去使用setTimeout