痛点:当我们的项目越来越庞大,项目中的某些组件之间可能会存在一些相似的功能,这就导致了在各个组件中需要编写功能相同的代码段,重复地定义这些相同的属性和方法,导致代码地冗余,还不利于后期代码的维护。
mixins(混入),官方的描述是一种分发 Vue 组件中可复用功能的非常灵活的方式,mixins 是一个 js 对象,它可以包含我们组件中 script 项中的任意功能选项,如:data、components、methods、created、computed 等等。我们只要将公用的功能以对象的方式传入 mixins 选项中,当组件使用 mixins 对象时所有 mixins 对象的选项都将被混入该组件本身的选项中来,这样就可以提高代码的重用性,并易于后期的代码维护。
需求:购物app有的页面游客可以访问,有的页面需要登录才可以访问,需要判断用户是否登录,没有登录提示去登陆,已登录的话,就啥也不敢,直接放行。这样的代码往往复用性很强。
应用:
loginConfirm .js:
- export default {
- // 此处编写的就是 Vue组件实例的 配置项,通过一定语法,可以直接混入到组件内部
- // data methods computed 生命周期函数 ...
- // 注意点:
- // 1. 如果此处 和 组件内,提供了同名的 data 或 methods, 则组件内优先级更高
- // 2. 如果编写了生命周期函数,则mixins中的生命周期函数 和 页面的生命周期函数,
- // 会用数组管理,统一执行
- created () {
- // console.log('嘎嘎')
- },
- data () {
- return {
- title: '标题'
- }
- },
- methods: {
- sayHi () {
- // console.log('你好')
- },
-
- // 根据登录状态,判断是否需要显示登录确认框
- // 1. 如果未登录 => 显示确认框 返回 true
- // 2. 如果已登录 => 啥也不干 返回 false
- loginConfirm () {
- // 判断 token 是否存在
- if (!this.$store.getters.token) {
- // 弹确认框
- this.$dialog.confirm({
- title: '温馨提示',
- message: '此时需要先登录才能继续操作哦',
- confirmButtonText: '去登陆',
- cancelButtonText: '再逛逛'
- })
- .then(() => {
- this.$router.replace({
- path: '/login',
- query: {
- backUrl: this.$route.fullPath
- }
- })
- })
- .catch(() => {})
- return true
- }
- return false
- }
- }
- }
import loginConfirm from '@/mixins/loginConfirm'
mixins属性和name、data同级。
-
- name: 'paymentIndex',
- mixins: [loginConfirm],
在添加购物车的时候:
- async addCart () {
- if (this.loginConfirm()) {
- return
- }
- // 省略部分逻辑代码
- this.$toast('加入购物车成功')
- },