美文网首页
vue项目中利用$attrs和$listeners达到简化代码结

vue项目中利用$attrs和$listeners达到简化代码结

作者: videring | 来源:发表于2020-05-14 15:21 被阅读0次

在vue项目中,一个vue单文件里往往有多个弹框(以elementUI为了,那就是el-dialog组件),杂乱而繁多,在这里尝试以一种简化的方式来处理。

  • 为了方便说明,以一个简单例子进行说明,要实现下图效果,点击“打开弹窗”,在弹窗中点击“Add”,可以增加selectNumber,点击“关闭”按钮,可以关闭按钮:


  • 原有代码如下:
// vue单文件页面
<template>
  <div>
    <el-button @click="visible=true">打开弹窗</el-button>
    selectNumber:{{selectNumber}}
    <el-dialog
       :visible.sync="visible"
       :show-close="false"
       title="我是题目"
       width="400px"
       @close="closeDialog('hehe')">
          {{selectNumber}}
          <el-button @click="handleClick">Add</el-button>
          <el-button @click="handleClose">关闭</el-button>
     </el-dialog>
  </div>
</template>
<script>
export default {
  data() {
    return {
      selectNumber: 0,
      visible: false
    }
  }
 methods: {
    handleClick() {
      this.selectNumber +=1
    },
    closeDialog() {
      this.visible = false
      this.$message({ type: 'success', message: '关闭' })
    }
  }
}
</script>
  • 当一个功能页面(假如对应一个vue但未见)中交互复杂,存在多个el-dialog组件,然后每一个里面有或多或少的逻辑的话,那么代码行数会明显增加,我们往往采取下面几种方式来优化代码结构:
  1. 通过MessageBox方式来处理逻辑较简单的弹窗效果,见官方示例MessageBox 弹框

  2. 通过mixin的方式组织代码使结构更清晰简洁,但是这种无法使template部分更为简洁

  3. 将弹框封装成组件,将弹框中的业务逻辑封装进组件,接着前例,改造如下:

// vue单文件页面
<template>
  <div>
    <el-button @click="visible=true">打开弹窗</el-button>
    selectNumber:{{selectNumber}}
    <test-dialog
           :visible.sync="visible"
           :show-close="false"
           title="我是题目"
           width="400px"
           :selectNumber.sync="selectNumber"
           @close="closeDialog('hehe')">
     </test-dialog>
  </div>
</template>
<script>
import testDialog from './testDialog.js'
export default {
  data() {
    return {
      selectNumber: 0,
      visible: false
    }
  },
  components: {
    testDialog
  },
  methods: {
    closeDialog() {
      this.visible = false
      this.$message({ type: 'success', message: '关闭' })
    }
  }
}
</script>

// test-dialog组件:

export default {
  name: 'testDialog',
  template: `
      <el-dialog v-bind="$attrs" :visible.sync="visible" v-on="$listeners">
          {{selectNumber}}
          {{this.$attrs}}
          <el-button @click="handleClick">Add</el-button>
          <el-button @click="handleClose">关闭</el-button>
      </el-dialog>
  `,
  props: {
    visible: false
  },
  data() {
    return {
      ...this.$attrs
    }
  },
  watch: {
    visible: {
      handler() {
        Object.keys(this.$attrs).forEach(attr => {
          this[attr] = this.$attrs[attr]
        })
      },
      deep: true,
      immediate: true,
    }
  },
  methods: {
    handleClick() {
      this.selectNumber += 1
      this.tableData.push(this.selectNumber)
    },
    handleClose() {
      this.$emit('update:visible', false)
      this.$emit('update:selectNumber', this.selectNumber)
      this.$emit('update:tableData', this.tableData)
    }
  },
  created() {
    // console.log('this.$attrs ', this, this.$attrs, new Date().valueOf())
  }
}

test-dialog组件主要用到了$attrs$listeners来达到透传的效果,通过.sync使得数据能更新到父组件中。从效果上来看,既达到了js的拆分,又实现了模板的拆分,同时部分变量(sync修饰的)达到了父子组件共享的效果。

相关文章

  • vue项目中利用$attrs和$listeners达到简化代码结

    在vue项目中,一个vue单文件里往往有多个弹框(以elementUI为了,那就是el-dialog组件),杂乱而...

  • Vue2.4 $attrs、$listeners、inherit

    在开始介绍之前先看下vue官方文档对 $attrs和 $listeners的解释: vm.$attrs包含了父作用...

  • vue $attrs, $listeners

    vm.$attrs 包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style...

  • Vue组件间11种通信方式的简要介绍

    Vue组件的通信方式大致有这11(12)种 常用的Props $attrs & $listeners provid...

  • vue $attrs与$listeners

    在组件多级嵌套的情况下,相互间的传值是这样的呢 ? A 根组件B 子组件C 孙组件... 在很多开发情况下,我们只...

  • vue $attrs 与$listeners

    参考https://blog.csdn.net/songxiugongwang/article/details/8...

  • vue 的$attrs $listeners

    组件多级嵌套,相互传递如何实现的A:父组件B:子组件C:孙组件在开发过程中,有时候想把某些数据从A组件传递给C组件...

  • Attrs 和 Listeners

    这两个属性是 vue 2.4 版本之后提供的,它简直是二次封装组件或者说写高阶组件的神器。在我们平时写业务的时候免...

  • $attrs和$listeners

    $attrs 属于组件的一个属性,可以获取到父组件传递过来的props数据对于子组件而言,父组件给的数据可以利用p...

  • vue中的$attrs和$listeners

    在组件多级嵌套的情况下,相互间的传值是这样的呢 ? A组件(父组件)➡️B组件(子组件)➡️C组件(孙组件) 在很...

网友评论

      本文标题:vue项目中利用$attrs和$listeners达到简化代码结

      本文链接:https://www.haomeiwen.com/subject/hrstohtx.html