我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue项目中常用的实用技巧总结

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue项目中常用的实用技巧总结

本篇内容主要讲解“Vue项目中常用的实用技巧总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目中常用的实用技巧总结”吧!

目录
  • 前言

  • 使用 $attrs 和 $listeners 进行多层级的数据和事件传递

  • 实现数据的双向绑定,方便维护数据

    • 使用 .sync 实现 Prop 的“双向绑定”

    • 使用 model 选项

  • 使用 Mixins

    • 使用动态组件去懒加载组件

      • 在组件作用域内的 CSS 中使用 ::v-deep  修改组件样式

        • 使用装饰器优化代码

          • 利用 require.context 去获取项目目录信息

            • 总结

              • 引用

                前言

                在 Vue 项目开发中,很容易产生一些问题,比如代码重复、繁杂等,其实 Vue 项目开发中有很多技巧可以使用,本文将列出一些简单且很好用的几个技巧,帮助我们写出漂亮的代码。用到的技术栈是 Vue2.0 + TypeScript +  vue-property-decorator + ElementUI。将用到以下几个技巧:

                • 使用 $attrs 和 $listeners 进行多层级的数据和事件传递

                • 实现数据的双向绑定,方便维护数据

                • 使用 Mixins

                • 使用动态组件去懒加载组件

                • 在组件作用域内的 CSS 中使用 ::v-deep  修改组件样式

                • 使用装饰器优化代码

                • 利用 require.context 去获取项目目录信息

                1. 使用 $attrs 和 $listeners 进行多层级的数据和事件传递

                先聊聊如何传递 Prop,可以分为静态和动态的 Prop:

                <!-- 静态的prop --><blog-post title="My journey with Vue"></blog-post><!-- 动态的prop --><blog-post v-bind:title="post.title"></blog-post><!-- 动态的prop传递可以简写成 --><blog-post :title="post.title"></blog-post><!-- 需要传递多个prop的时候,可以一起写在v-bind上 --><blog-post v-bind="{ editable, title: post.title}"></blog-post>

                了解了 Props 的传递方式,在看看官方文档是怎么定义 $attrs 的,  在尤大大的文档中这样介绍了 $attrs:

                $attrs:  包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件

                $attrs  包含了传入到父作用域中没有在 props 声明的其他 props,因此我们可以用 $attrs 去代替那些父组件中不需要的而子组件需要的 props, 通过 v-bind="$attrs" 统一传递给后代。这样就避免了一个个声明然后再一个个传递。

                <blog-post v-bind="$attrs"></blog-post>

                上面这一行代码就通过 v-bind="$attrs" 的方式将本作用域中不作为 prop 的其他属性传递给了 blog-post 组件。

                父组件通过 $attrs 传递给后代组件后,后代组件如果想通过触发事件来更新父组件状态该如何处理?如果一级一级地往上 emit 事件,会不会弄得代码太繁琐复杂了?在 Vue 中可以通过 $listeners 解决这个问题,先看看官方文档关于  $listeners 的说明:

                包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。

                文档中说了 $listeners 包含了父作用域中的事件监听器。意思就是 $listeners 表示了父组件中的事件监听器集合,只要是触发父组件的事件,而不是自己的,就可以用一个 v-on="$listeners"表示。

                <!-- 父组件(第一层组件) --><componentA @on-change="handleChange" v-bind="{ editable, title: post.title}" /><!-- 中间层的组件 --><Child v-bind="$attrs" v-on="$listeners"/><!-- 数据传递的目标组件,事件触发的组件 --><div @click="handleClick">{{ title }} </div><script>  export default {    props: {      title: String    }    handleClick() {      this.$emit('on-change', 'New Title');    }  }</script>

                上面的代码示例中,中间层的组件内通过 v-bind="$attrs" 将其余的 Prop 传递给了 Child 组件,再通过 v-on="$listeners" 绑定父作用域中的事件监听器,一旦 emit 就会传给了父组件。

                2. 实现数据的双向绑定,方便维护数据

                有很多这样的场景,父组件需要传递数据给子组件,且在子组件触发数据更新的时候,马上反馈给父组件,父组件数据更新,单向数据流向子组件,最后子组件更新。通常情况用 props + $emit 的方式去更新状态,但是这种处理方式有点笨拙,且不易维护,所以可以通过实现数据的“双向绑定”来提高代码的可维护性。可以通过这以下方式去实现:

                使用 .sync 实现 Prop 的“双向绑定”

                在 v-bind prop的时候添加  .sync 修饰符,赋新值的时候用  this.$emit('update:propName', newValue)

                <!-- .sync是 v-on:update这种模式的一种缩写 --><Child v-on:update:title="title" /><!-- 相当于 --><Child :title.sync="title" />

                如果要更新上述代码中的 title 值,只需要   this.$emit('update:title', '新标题'),完成数据更新。

                使用 model 选项

                model 是2.2.0+ 新增的选项,一个组件上的 v-model 默认会利用名为 value  的 Prop  和名为 input 的事件, 而 model 选项可以规定 Prop 名称和事件名称来实现 v-model,好处是在实现 v-model 的同时也避免了 Prop 和事件名的冲突。

                <!-- 父组件 --><Model v-model="checked"/><!-- Model组件 --><div @click="handleClick">  <p>自定义组件的 v-model</p>  checked {{checked}}</div><script lang="ts">export default {  model: {    prop: 'checked',    event: 'change'  },  props: {    checked: Boolean  },  methods: {    handleClick() {      this.$emit('change', !this.checked);    }  }

                在上述代码中,只需要在 model 选项中添加 prop 和 event,就可以实现了 v-model。而在 Vue + TS 项目中 vue-property-decorator 中提供了 Model 的装饰器,需要这么写:

                @Model('change', { type: Boolean }) readonly checked!: booleanhandleClick() {  this.$emit('change', !this.checked);}

                只需要通过 .sync 和 model 就可以实现数据的“双向绑定”,这样书写代码可以一定程度上减少我们的代码,而且另代码变得更优雅且可维护。

                3. 使用 Mixins

                Mixins 可以用于两种场景:

                1. 利用它去抽取成组件内的公共代码加强代码复用,不要在全局内套来套去,最好在组件内或者页面中使用。

                2. 利用它去分离功能点,有时候会遇到一种情况,就是业务功能很多导致写起来的 Vue 文件行数很多,导致代码很难以维护,功能点代码不好追踪。可以通过抽取功能代码的方式,让这个庞大的 Vue 文件更好维护。

                首先写一个公共的 mixin 文件, 把高复用的状态和函数写进去。

                export default class CommonMixins extends Vue{    public paginations = {        pageSize: 20,        total: 0,        currentPage: 1,    }    handleChangePageSize (pageSize: number, cb: Function) {        this.paginations.pageSize = pageSize;        cb();    }    handleChangePageNum (currentPage: number, cb: Function) {        this.paginations.currentPage = currentPage;        cb();    }}

                vue-property-decorator 提供了 Mixins 的装饰器,在业务页面中引入 Mixin 只需要往里 Mixins 传入 , 可以传多个,表示混入多个 Mixin。

                <script lang="ts">import { Component, Mixins } from 'vue-property-decorator';import CommonMixins from "./common-mixin";import PermissionMixins from "./permission-mixin";@Component({})export default class Parent extends Mixins(CommonMixins, PermissionMixins) {}</script>

                如果只需要一个的话,也可以直接继承

                <script lang="ts">import { Component, Mixins } from 'vue-property-decorator';import CommonMixins from "./common-mixin";@Component({})export default class Parent extends CommonMixins {}</script>

                在遇到功能点多,代码量大的页面时,我们可以利用 Mixin 抽离一些功能点,通过文件去管理这些功能,这样会比较方便去管理代码。

                4. 使用动态组件去懒加载组件

                组件在加载都是同步的,但当页面内容很多,有些组件并不需要一开始就加载出来的比如弹窗类的组件,这些就可以用动态组件,当用户执行了某些操作后再加载出来,这样可以提高主模块加载的性能, 在 Vue 中可以使用 component 动态组件, 依 is 的值,来决定哪个组件被渲染。

                <template>  <div>    主页面 <br/>    <button @click="handleClick1">点击记载组件1</button><br/>    <button @click="handleClick2">点击记载组件2</button><br/>    <component :is="child1"></component>    <component :is="child2"></component>  </div></template><script lang="ts">import { Component, Vue } from 'vue-property-decorator';@Component({})export default class AsyncComponent extends Vue {  public child1:Component = null;  public child2:Component = null;  handleClick1() {    this.child1 = require('./child1').default;  }  handleClick2() {    this.child2 = require('./child2').default;  }}</script>

                示例代码中,只有当点击的时候才会去加载组件。component 还可以配合 v-show 去控制显示和隐藏,这样这个component 只会 mounted 一次,优化性能。

                5. 在组件作用域内的 CSS 中使用 ::v-deep  修改组件样式

                有很多场景想更改 UI 组件样式,然后怕影响别人的使用,加上 scoped 后又不能生效,可以使用  ::v-deep 深度作用选择器去修改组件作用域内的 CSS 的样式。在 CSS 中我们可以使用 >>> 操作符,但在预处理器中的写法就要用 /deep/ 或 ::v-deep。

                <style scoped>>>> .ivu-tabs-tabpane {        background: #f1f1f1;    }</style><style lang="scss" scoped>/deep/ .ivu-tabs-tabpane {        background: #f1f1f1;    }</style><style lang="scss" scoped>::v-deep .ivu-tabs-tabpane {        background: #f1f1f1;    }</style>

                ::v-deep 和 /deep/ 作用是一样的,但不推荐使用 /deep/, 在 Vue3.0 中将不支持 /deep/ 这种写法。

                6. 使用装饰器优化代码

                装饰器增加了代码的可读性,清晰地表达了意图,而且提供一种方便的手段,增加或修改类的功能,比如给类其中的方法提供防抖的功能。

                import debounce from 'lodash.debounce';export function Debounce(delay: number, config: object = {}) {  return (target: any, prop: string) => {    return {      value: debounce(target[prop], delay, config),    };  };}

                这样的好处是使用起来非常方便,另外增加了代码的可读性。

                @Debounce(300)onIdChange(val: string) {  this.$emit('idchange', val);}

                7. 利用 require.context 去获取项目目录信息

                关于 require.context,webpack 文档是这么描述的:

                可以给这个函数传入三个参数:一个要搜索的目录,一个标记表示是否还搜索其子目录, 以及一个匹配文件的正则表达式。
                webpack 会在构建中解析代码中的 require.context() 。如果想引入一个文件夹下面的所有文件,或者引入能匹配一个正则表达式的所有文件,这个功能就会很有帮助

                根据这个提示,我们可以引用到一个文件夹下面的所有文件,由此可以利用获取的文件信息去做一些操作,比如在注册组件的时候,原本我们注册组件的时候需要一个个引入并且一个个注册,而且后面想加新的,又要再写上,现在可以通过 require.context 去优化这一段代码。

                // import WmsTable from './wms-table/table/index';import Table from './table/index.vue';import CustomHooks from './custom-hooks/custom-hooks-actions/index';import SFilter from './s-filter/filter-form';import WButton from './button/index';import CreateForm from './createForm/create-form/CreateForm.vue';import Action from './table/action-table-column.vue';import DetailItem from './detail-item.vue';Vue.component('w-filter', SFilter);Vue.component('w-button', WButton);Vue.component('custom-hooks', CustomHooks);Vue.component('create-form', CreateForm);Vue.component('w-table', Table);Vue.component('w-table-action', Action);Vue.component('zonetime-date-picker', ZonetimeDatePicker);Vue.component('detail', DetailItem);

                注册全局组件的时候,不需要一个一个 import,和一个个去注册,使用 require.context 可以自动导入模块,这样的好处在于,当我们新建一个组件,不用自己再去手写注册,而在一开始就帮我们自动完成。

                const contexts = require.context('./', true, /\.(vue|ts)$/);export default {  install (vm) {    contexts.keys().forEach(component => {      const componentEntity = contexts(component).default;      if (componentEntity.name) {        vm.component(componentEntity.name, componentEntity);      }    });  }};

                总结

                本文介绍了在 Vue 实战中经常用到的一些技巧,这些技巧的目的都是为了提升开发效率,比如简单地实现双向数据绑定和数据跨级传递等,另外也可以提高代码的可维护性、可读性,比如很实用的装饰器和利用 Mixin 拆分代码和管理功能点。

                到此,相信大家对“Vue项目中常用的实用技巧总结”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

                免责声明:

                ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

                ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

                Vue项目中常用的实用技巧总结

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

                下载Word文档

                猜你喜欢

                Vue项目中常用的实用技巧总结

                本篇内容主要讲解“Vue项目中常用的实用技巧总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目中常用的实用技巧总结”吧!目录前言1. 使用 $attrs 和 $listeners 进行
                2023-06-20

                Vue项目常用的技巧有哪些

                本篇内容介绍了“Vue项目常用的技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 使用 $attrs 和 $listeners
                2023-07-04

                Android编程常用技巧实例总结

                本文实例讲述了Android编程常用技巧。分享给大家供大家参考,具体如下: 1. 登录的时候,如果输入有误,则输入框左右震动,表示输入有误 在res下准备一个anim文件夹,里面包含两个文件,main_login_shake.xml 和 m
                2022-06-06

                Python常用的爬虫技巧总结

                用python也差不多一年多了,python应用最多的场景还是web快速开发、爬虫、自动化运维:写过简单网站、写过自动发帖脚本、写过收发邮件脚本、写过简单验证码识别脚本。 爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情。
                2022-06-04

                vue项目中常用解决跨域的方法总结(CORS和Proxy)

                在vue项目中,一般我们会遇到跨域的问题,vue项目中解决跨域是非常简单的,下面这篇文章主要给大家介绍了关于vue项目中常用解决跨域的方法,主要解释CROS和Proxy两种方式,需要的朋友可以参考下
                2022-12-08

                Git与持续集成技巧实战:项目经验总结

                Git与持续集成技巧实战:项目经验总结引言:在软件开发领域,版本控制系统和持续集成技术是不可或缺的工具,它们能够极大地提高团队合作效率,确保软件质量和交付速度。本文将从实际项目经验出发,总结一些Git和持续集成技巧,帮助读者更好地应用于实践
                Git与持续集成技巧实战:项目经验总结
                2023-11-03

                Git与团队协作实践技巧:项目经验总结

                Git是目前最流行的版本控制系统之一,广泛应用于软件开发过程中。在团队协作中,Git的使用对于项目的顺利进行和代码的管理起到至关重要的作用。本文将从项目经验出发,总结一些Git与团队协作的实践技巧。一、合理的分支管理分支是Git的核心概念之
                Git与团队协作实践技巧:项目经验总结
                2023-11-03

                总结python爬虫抓站的实用技巧

                前言 写过的这些脚本有一个共性,都是和web相关的,总要用到获取链接的一些方法,累积不少爬虫抓站的经验,在此总结一下,那么以后做东西也就不用重复劳动了。 1.最基本的抓站import urllib2 content = urllib2.ur
                2022-06-04

                Python项目通用的目录结构总结

                一个好的项目结构会让我们在开发中更加得心应手。对于Web项目,我们通常采用Flask或Django等框架,会有一套适合这种项目的工程目录。对于爬虫项目,通常有Scrapy等开源框架,也会提供一套适合这种项目的工程目录。对于通用的一些Pyth
                2023-01-31

                帝国cms模板开发常用技巧总结

                本文详细讲述了帝国cms模板开发常用技巧。分享给大家供大家参考。具体分析如下: 对于使用帝国编程客栈cms的一些新人来说,经常会做做模板的时候遇到一些小问题,大大降低了模板的制作速度! 以下总结了一部分帝国cms中常用的一些技巧,应该可以帮
                2022-06-12

                编程热搜

                • Python 学习之路 - Python
                  一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
                  Python 学习之路 - Python
                • chatgpt的中文全称是什么
                  chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
                  chatgpt的中文全称是什么
                • C/C++中extern函数使用详解
                • C/C++可变参数的使用
                  可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
                  C/C++可变参数的使用
                • css样式文件该放在哪里
                • php中数组下标必须是连续的吗
                • Python 3 教程
                  Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
                  Python 3 教程
                • Python pip包管理
                  一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
                  Python pip包管理
                • ubuntu如何重新编译内核
                • 改善Java代码之慎用java动态编译

                目录