广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue中mixins的工具的封装方式
  • 185
分享到

vue中mixins的工具的封装方式

2024-04-02 19:04:59 185人浏览 八月长安
摘要

目录mixins工具的封装Vue的mixins的工具是什么?js工具代码三、使用这个文件vue组件封装及注意事项调用的时候我们已经会使用 父组件向子组件传数据了,那子组件如何来修改父

mixins工具的封装

vue的mixins的工具是什么?

就是我们再写信息管理系统时,涉及到大量的增删查改调用后台接口的重复的方法,我们可以把这些方法集合起来直接作为一个js文件,后面可以直接引入,数据和方法都不需要声明,直接使用即可。

再概括一下,就是请求后台接口的方法的集合。

js工具代码

具体注释我会直接写在代码里,然后大家可以自己直接对照着代码看

代码如下:

//这里引入了qs,使用npm install qs就可进行安装,在后面下载的方法里用到(get方法拼接参数),
//如果没有这个需求,可以不引入(同时注意删除下方的下载方法)
import qs from 'qs'
export default {
  data() {
    return {
    //这个mixinViewModuleOptions需要在使用这个工具的时候在vue文件的data中声明
      mixinViewModuleOptions: {
        mockData: null,
        getDataListURL: '', // 数据列表接口 api地址
        activatedIsNeed: true, // 此页面是否在激活(进入)的时候,调用查询数据列表接口
        queryDataURL: '', // table查询接口
        deleteURL: '', // 删除接口
        downLoadURL: '', // 下载接口
        deleteIsBatch: false, // 是否批量删除
        deleteIsBatchKey: 'id', // 删除接口,批量状态下有那个key进行标记操作,比如 pid,uid
        // getDataListIsPage: true // 不同的数据接口,返回的数据接口不相同,用次变量来区别
      },
      dataFORM: {}, // 查询条件
      dataList: [], // 数据列表
      page: 1, // 当前页码
      rows: 10, // 每页数
      total: 0, // 总条数
      dataListLoading: false, // 数据列表,loading状态
      dataListSelections: [], // 数据列表,多选项
      addOrUpdateVisible: false, // 新增/更新,弹窗visible状态
    }
  },
  created() {
    if (this.mixinViewModuleOptions.activatedIsNeed) {
     //获取数据的方法
      this.getDataList()
    }
  },
  methods: {
    // 下载excel
    downLoadHandle(id) {
      if (!this.dataList.length) {
        return this.$message.warning('没有可导出的数据')
      }
      if (!id) {
        return this.$message.warning('id字段无效错误')
      }
      const ids = this.dataListSelections.map(a => a[id]).join(',')
      //最开始引入的qs在这里用到,作用:将dataForm这个对象用‘&'拼接成字符串,再拼到下载链接后
      const dataForm = qs.stringify(Object.assign({}, this.dataForm, { ids }))
   
      const url = `${window.SITE_CONFIG.BASE_URL.serverIP}${this.mixinViewModuleOptions.downLoadURL}?${dataForm}`
      window.open(url)
    },
     // 删除
    deleteHandle(id) {
      if (!id && this.mixinViewModuleOptions.deleteIsBatch
      && this.dataListSelections.length <= 0) {
        return this.$message({
          message: '请选择删除项',
          type: 'warning',
          duration: 800,
        })
      }
      this.$confirm('您确定删除此条内容么', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      }).then(() => {
        let ids = ''
        if (this.dataListSelections.length) {
          ids = this.dataListSelections.map(item =>
          `${item[this.mixinViewModuleOptions.deleteIsBatchKey]}`).join(',')
        } else {
          ids = id
        }
        this.$Http.get(`/${this.mixinViewModuleOptions.deleteURL}`, {
          params: {
            id: ids,
          },
        }).then(({ data }) => {
          if (data.code !== 1) {
            return this.$message.error(data.msg)
          }
          this.$message({
            type: 'success',
            message: '删除成功!',
            duration: 800,
            onClose: () => {
              this.getDataList()
            },
          })
        })
      }).catch(() => {
      })
    },
    // 新增 / 修改
    addOrUpdateHandle(id) {
      this.addOrUpdateVisible = true
      this.$nextTick(() => {
        this.$refs.addOrUpdate.dataForm.id = id
        this.$refs.addOrUpdate.init()
      })
    },
    dataListSelectionChangeHandle(val) {
      this.dataListSelections = val
    },
    // 查询
    queryHandle() {
      this.page = 1
      this.getDataList()
    },
    // 获取table数据
    getDataList() {
      this.dataList = []
      this.dataListLoading = true
      return this.$http.get(`/${this.mixinViewModuleOptions.getDataListURL}`, {
        params: {
          page: this.page,
          rows: this.rows,
          ...this.dataForm,
        },
      }).then(({ data }) => {
        this.dataListLoading = false
        if (data.code !== 1) {
          this.dataList = []
          this.total = 0
          return this.$message.error(data.msg)
        }
        this.dataList = data.data ? data.data : []
        this.total = data.total ? data.total : 0
        return data.data
      }).catch(() => {
        this.dataListLoading = false
      })
    },
    // 分页, 每页条数
    pageSizeChangeHandle(val) {
      this.page = 1
      this.rows = val
      if (this.dataForm.pageSize) {
        this.dataForm.pageNum = 1
        this.dataForm.pageSize = val
      }
      this.getDataList()
    },
    // 分页, 当前页
    pageCurrentChangeHandle(val) {
      this.page = val
      if (this.dataForm.pageNum) {
        this.dataForm.pageNum = val
      }
      this.getDataList()
    },
  },
}

三、使用这个文件

1.引入

//js文件名称是view-module.js,引入过来之后命名 mixinViewModule(后面需要用到,注意一致)
import mixinViewModule from "@/mixins/view-module";

2.声明

直接只贴声明的代码让人看不明代位置,声明的位置又不好描述,我这里直接贴图:

在这里插入图片描述

3.使用文件的html代码

<template>
  <section class="main-container-box">
      <el-form ref="form" :model="dataForm" inline>
        <el-form-item label="商品名称:">
          <el-input placeholder="请输入物资名称" v-model="dataForm.GoodsName" clearable></el-input>
        </el-form-item>
        <el-form-item>
           //这里的getDataList方法不需要再methods中声明,会直接执行view-module.js中的getDataList方法,参数为上面声明的dataForm
           <el-button type="plain" @click="getDataList">查询</el-button>
        </el-form-item>
      </el-form>
      //这里的dataList和view-module.js文件中的数据列表dataList名称要一致,并且可以不用在data中声明
      <el-table-self
            :data="dataList"
            style="width:100%"
            :height="'calc(100vh - 1.3rem)'"
            >
            <el-table-column  label="序号"  type="index" align="center" header-align="center" width="60"></el-table-column>   
            //这里就是自己表格中的数据,我只是遍历写出来的,大家可以不用管----↓
            <el-table-column  
                  v-for="(item,index) in columnList"
                  :key="index"
                  show-overflow-tooltip
                  :align="item.align" 
                  :fixed="item.fixed"
                  :prop="item.prop" 
                  :label="item.label"
            ></el-table-column>
            //---------------------------------------------------------------↑
      </el-table-self>
	//这是分页组件,注意里面的参数:page,rows,total和方法pageSizeChangeHandle,pageCurrentChangeHandle名称都要和view-module中一致
      <el-pagination
        :current-page="page"
        :page-sizes="[10, 20, 50, 100]"
        :page-size="rows"
        :total="total"
        layout="total, sizes, prev, pager, next, jumper"
        @size-change="pageSizeChangeHandle"
        @current-change="pageCurrentChangeHandle"
      ></el-pagination>
  </section>
</template>

总结:在管理信息系统中,基本的表格的增删查改功能有很多,每个都写一个方法对接接口会很麻烦,有了这个js工具了之后,每个文件只需要把它引入,然后传入对应的参数就可以了(mixinViewModuleOptions),只需要注意各个参数和方法名称都要对应起来,不要写错了,就可以节省很多时间和代码啦!

vue组件封装及注意事项

props : {
        beanProps : {
            type : Object
        },
        // 多种类型
        propB: [String, Number],
        // 必传且是字符串
        propC: {
          type: String,
          required: true
        },
        // 数字,有默认值
        propD: {
          type: Number,
          default: 100
        },
        // 数组/对象的默认值应当由一个工厂函数返回
        propE: {
          type: Object,
          default: function () {
            return { message: 'hello' }
          }
        },
        // 自定义验证函数
        propF: {
          validator: function (value) {
           return value > 10
          }
        }
    },

我们在 props 中接收数据,注意props对象里面 键值 是对改数据的 数据类型 的规定。做了规范,使用者就只能传输指定类型(type类型)的数据,否则报警告

而props对象中的数据,我们可以直接在当前组件中使用  this.beanProps ,可以直接使用。这里要强调一下,props传过来的数据只做展示,不得修改,想修改,再新写一个data中的变量承接做数据的再处理。

调用的时候

<!--要调用的页面组件的页面需要import导入组件页面,然后再起别名-->
import treeSelectPeople from "../../../components/tree-select-people.vue";
 
<!--导入之后要添加组件到component对象里-->
 components: { treeSelectPeople },
 
<!--然后调用的时候标签名,就是你导入组件起的变量名了-->
<treeSelectPeople :beanProps="newBean.props"></treeSelectPeople>

我们已经会使用 父组件向子组件传数据了,那子组件如何来修改父组件的数据呢?

这里提供 2 种实现方法,但是 第一种不推荐,强烈不推荐

方式一:  

selectValue: {
          data: '1'
        },
 //代码段
 this.selectValue.data = '我被修改了'

即,父组件将 对象 数据传递给子组件,子组件直接修改props过来的对象的值

可以实现,感觉是一个比较快捷的方式。但是不推荐,这种方式写多了,容易出错,特别是多层组件嵌套的时候。这种修改对代码的迭代和错误的捕捉都不友好,所以建议大家别这样写。

他的实现原理简单提一下: 这个对象、数组啦,是引用数据类型,说白了,就是存储单元的信息是指针,真正数据在别的地方,通过指针查询的数据,所以这样写,对浏览器来说仅仅是传递了一个指针,数据还是同一份数据。所以你能修改。

方式二:

正儿八经的通过 $emit 方法去掉父组件的方法,在父组件中修改data的数据。(根正苗红的方法,规范写法)(就是在子组件新建一个新的变量来获取父组件传过来的值) 

<template>
    <section class="f-mainPage">
        <!--selectFunc 选择完成的回调      searchList 下拉列表的数据-->
        <search @selectFunc="selectFunc" :searchList="searchList" :selectValue="selectValue"></search>
    </section>
</template>
<script type="text/ecmascript-6">
  import Search from '../vuePlugin/search'
  export default {
    data() {
      return {
        searchList: ['草船借箭', '大富翁', '测试数据'],
        // 直接通过props传递对象 修改,挺便捷的,但是不规范
        selectValue: {
          data: '1'
        },
        // 通过emit修改,规范写法
        selectValue2: ''
      }
    },
    mounted() {},
    methods: {
      pageGo(path) {
        this.$router.push('/' + path)
      },
      selectFunc(value) {
        this.selectValue2 = value
        console.log(this.selectValue)
        console.log(this.selectValue2)
      }
    },
    components: {
      Search
    }
  }
</script>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vue中mixins的工具的封装方式

本文链接: https://www.lsjlt.com/news/149569.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue中mixins的工具的封装方式
    目录mixins工具的封装vue的mixins的工具是什么?js工具代码三、使用这个文件vue组件封装及注意事项调用的时候我们已经会使用 父组件向子组件传数据了,那子组件如何来修改父...
    99+
    2022-11-13
  • vue中所有的封装方式总结
    本篇内容主要讲解“vue中所有的封装方式总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue中所有的封装方式总结”吧!目录封装API 注册全局工具组件 3.封装全局函数&...
    99+
    2023-06-20
  • Pandas封装Excel工具类的方法步骤
    目录引言1、列表转Excel文件2、多个列表转Excel文件3、读取Excel表格数据4、合并多个Excel文件到一个文件中(每个文件对应一个工作表)引言 Excel是一种广泛使用的...
    99+
    2023-05-16
    Pandas封装Excel Pandas Excel封装
  • C#串口通信工具类的封装方法
    本篇内容介绍了“C#串口通信工具类的封装方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1、SerialPortHelper串...
    99+
    2023-06-29
  • .NET中的Husky工具及安装方式
    今天不讲技术,讲一讲工具。对于会前端开发程序员来说前端工程化工作流中有个常用的工具 Husky ,它方便我们在项目中添加 git hooks 在代码提交前自动检查编码规范,或对填写的...
    99+
    2022-11-12
  • 浅谈vue中所有的封装方式总结
    目录1.封装API 2.注册全局工具组件 3.封装全局函数4. 为了减少页面代码量的封装如何确定我需要封装呢? 1.复用,如果觉得以后还会用到 2.你觉...
    99+
    2022-11-12
  • PHP中封装性的调试技巧与工具
    封装是面向对象编程中的一个重要概念,它可以帮助我们将功能模块化,使代码更加可维护和可复用。然而,在实际的开发过程中,封装性也会给调试带来一定的挑战。本文将介绍一些PHP中封装性的调试技巧与工具,帮助开发者更好地调试封装好的代码。使用合适的错...
    99+
    2023-10-21
    调试器 (Debugger) 断点 (Breakpoints) 日志 (Logs)
  • vue项目中封装echarts的优雅方式分享
    目录场景需求代码总览实现components--chart--index.vuecomponents--chart--index.jscomponents--chart--optio...
    99+
    2022-11-13
  • 【JAVA高级】——吃透JDBC中的封装工具类、ORM和Date工具类
    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:乐趣国学的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者成长之路 ...
    99+
    2023-08-31
    数据库 java mysql
  • C#串口通信工具类的封装
    本文实例为大家分享了C#串口通信工具类的封装代码,供大家参考,具体内容如下  1、SerialPortHelper串口工具类封装 using System; using S...
    99+
    2022-11-13
  • Java日期工具类的封装详解
    概述 在日常的开发中,我们难免会对日期格式化,对日期进行计算,对日期进行校验,为了避免重复写这些琐碎的逻辑,我这里封装了一个日期工具类,方便以后使用,直接复制代码到项目中即可使用。 ...
    99+
    2022-11-13
    Java日期工具类 Java日期类
  • HttpClient 4.0封装工具类是怎样的
    这篇文章将为大家详细讲解有关HttpClient 4.0封装工具类是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。以下为本人在实际开发过程中封装的HttpClient工具类,HttpC...
    99+
    2023-06-03
  • PHP中封装性的代码质量检查工具
    封装性是面向对象编程的重要原则之一,它可以帮助我们更好地管理代码,减少代码的耦合性,提高代码的可维护性和可复用性。在PHP开发中,为了保证代码的封装性,我们可以借助一些代码质量检查工具来进行静态代码分析。本文将介绍一款常用的PHP代码质量检...
    99+
    2023-10-21
    PHP代码质量 封装性检查工具 PHP代码检查
  • PHP中封装性的静态代码分析工具
    引言:随着Web应用的不断发展,PHP已经成为了一种广泛使用的编程语言。然而,由于PHP语言的灵活性和简易性,很容易写出复杂、难以维护的代码。为了解决这个问题,开发人员经常需要使用静态代码分析工具来检测潜在的问题和提供最佳实践建议。本文将介...
    99+
    2023-10-21
    PHP 封装性 静态代码分析
  • SpringBoot中Bean拷贝及工具类封装的实现
    目录一、使用Spring BeanUtils使用示例:二、Bean 拷贝工具类封装使用示例在我们SpringBoot 项目的开发中,经常需要做对象的拷贝和转化,例如我们需要把前端传给...
    99+
    2023-05-19
    SpringBoot Bean拷贝 springboot复制bean
  • SpringBoot中操作Redis及工具类的封装详解
    目录一、引入依赖及进行配置二、使用三、Redis 操作工具类的封装一、引入依赖及进行配置 1.maven依赖的引入(继承了SpringBoot的父模块,所以不需要再声明版本) <...
    99+
    2023-05-19
    SpringBoot操作Redis方法 SpringBoot如何操作Redis SpringBoot操作Redis SpringBoot Redis
  • PHP中封装性的代码版本管理工具
    概述:在当今的软件开发过程中,版本管理是不可或缺的一环。它允许开发人员跟踪和管理不同版本的代码,以及进行协同开发和团队合作。封装性的代码版本管理工具是一种能够更好地管理PHP代码封装性的工具。本文将介绍如何使用Git作为一个强大的封装性代码...
    99+
    2023-10-21
    PHP 封装性 代码版本管理工具
  • Vue项目中封装axios的方法
    目录一、axios是什么特性基本使用二、为什么要封装三、如何封装设置接口请求前缀设置请求头与超时时间封装请求方法请求拦截器响应拦截器小结参考文献一、axios是什么 axios 是...
    99+
    2022-11-13
  • Redis工具类封装RedisUtils的使用示例
    此RedisUtil工具类的功能: 直接使用此RedisUtil工具类的所需条件: 项目基于SpringBoot。pom.xml中需要引入依赖spring-boot-starter...
    99+
    2022-11-13
  • Android封装的http请求实用工具类
    代码如下:import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL...
    99+
    2022-06-06
    工具类 HTTP 工具 http请求 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作