vue2知识点整理

1、mixin(公共代码抽离)
//vue内容:

<template>
    <div>
        <el-button @click="onClick">点一下mixin</el-button>
        <div>{{ msg }}</div>
    </div>
</template>
<script>
import mixin from "@/mixin/demo";
export default {
  data() {
    return {
    }
  },
  mixins: [mixin]
}

//mixin内容:

export default {
  data() {
    return {
      msg: "这是mixin的数据"
    };
  },
  created() {
    console.log("mixin" + 123);
  },
  methods: {
    onClick() {
      console.log("触发了mixin中的onClick");
    }
  }
};
2、provide inject组件通信(使用 provide 对外暴露方法,其他组件引用 inject,可以调用暴露的方法
//a组件中

export default {
    //供子组件使用,对外暴露方法
    provide: function() {
        return {
            parentFun: this.parentFun
        };
    },
    methods: {
        parentFun() {
            console.log("进入父组件中的方法");
        }
    }
}

//b组件中

export default {
  name: "log",
  inject: ["parentFun"],
  mounted() {
    this.parentFun();
  }
};

3、兄弟通信通过时间总线

全局挂载
Vue.prototype.$bus = new Vue();

发送消息

this.$bus.$emit("sendList", this.aList);

接收消息

this.$bus.$on("sendList", data => {
    console.log(data);
});

4、keep-alive有关的生命周期

activated钩子, 用于路由缓存, keep-alive为true只进入一次mounted,每次都会进入activated函数
deactivated钩子
//router.js
{
    path: "child2",
    component: Child2,
    meta: {
        keepAlive: true
    }
}

5、store相关

<template>
    <div>
        {{ count }}
        {{ doubleCount }}
        {{ doubleCount1 }}
        {{ doubleCount2 }}
    </div>
</template>

//引入辅助函数
import { mapState, mapGetters } from "vuex";
computed: {
    ...mapState({
      //state.参数.参数;第一个参数为模块名,第二个为数据
      count: state => state.count.count
    }),
    doubleCount1() {
      return this.$store.getters.doubleCount;
    },
    ...mapGetters(["doubleCount"]),
    ...mapGetters({
      doubleCount2: "doubleCount"
    })
},
methods:{
    update() {
      //同步存值
      this.$store.commit("updateCount");
      //异步存值
      this.$store.dispatch("delayUpdateCount");
    },
}


//store中count模块

export default {
  state: {
    count: 0,
    msg: "code"
  },
  getters: {
    doubleCount(state) {
      return state.count * 2;
    }
  },
  mutations: {
    //同步改变
    updateCount(state) {
      state.count++;
    }
  },
  actions: {
    //异步改变
    delayUpdateCount(context) {
      setTimeout(() => {
        context.commit("updateCount");
      }, 1000);
    }
  }
};

6、自定义指令

<template>
  <div>
    <div v-buried-point>自定义指令</div>
  </div>
</template>
<script>
    import buriedPoint from "@/utils/directive";
    export default {
        data() {
            return {
            }
          },
        directives: { buriedPoint },
    }
</script>

//directive.js


import Vue from "vue";
const buriedPoint = Vue.directive("buriedPoint", {
  //只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
  bind(el, binding, vnode) {
    function clickHandle(e) {
      if (!el.contains(e.target)) {
        return false;
      }
      console.log(e);
    }
    el.click = clickHandle;
    document.addEventListener("click", clickHandle);
  },
  //被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
  inserted(el) {
    // console.log(el);
  },
  //所在组件的 VNode 更新时调用,但是可能发生在其子VNode更新之前。指令的值可能发生了改变,也可能没有。
  update(el) {
    // console.log(el);
  },
  //只调用一次,指令与元素解绑时调用
  unbind(el) {
    // console.log(el);
  }
});

export default { buriedPoint };

7、插槽

<template>  
    <div>
        <solts>
            <!--此写法已过时<template slot="aaa" slot-scope="{one}">-->
            <template v-slot:aaa="one">
                <div>{{ one.movies }}</div>
            </template>
        </solts>
    </div>
</template>
<script>
import Solts from "@/components/solts.vue";
export default {
  name: "Child2",
  components: { Solts }
}

//solts.vue

<template>
  <div>
    插槽前
    <slot name="aaa" :movies="movies"></slot>
    插槽后
  </div>
</template>

<script>
export default {
  name: "solts",
  data() {
    return {
      movies: [
        "蜘蛛侠",
        "复仇者联盟",
        "金刚狼",
        "触不可及",
        "唐人街探案",
        "当幸福来敲门"
      ]
    };
  }
};
</script>

8、事件

//事件包含,通过.stop阻止点击父级事件时触发子级事件
<div @click="a">
    父级点击事件
    <div @click.stop="b">子级点击事件</div>
</div>

//v-on:click等同于@click
<div v-on:click="a">v-on:click点击事件</div>
<div @click="a">@click点击事件</div>

//通过.prevent阻止默认事件,即href跳转
<a href="https://www.baidu.com/">可能跳转到百度</a>
<a href="https://www.baidu.com/" @click.prevent="click1()">可能跳转到百度</a>

//.native可以在某组件的根元素上监听一个原生事件
<el-input
   v-model="searchName"
   //回车事件
   @keyup.enter.native="toSearch()"
   placeholder="请输入搜索的名称"
></el-input>

//绑定 attribute,v-bind:src等同于:src

<img v-bind:src="imageSrc" width="10" height="10" />
<!-- 缩写 -->
<img :src="imageSrc" width="10" height="10" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值