Vue工程化开发(脚手架环境)(下)

简介: Vue工程化开发(脚手架环境)(下)

五、组件(重点)


1、组件的注册及使用


Vue的组件按照类型可以分为:

  • 全局组件:只要注册好,可以在项目中任意.vue文件中使用
  • 局部组件:主要注册好,可以在当前的.vue文件中使用

无论是全局组件还是局部组件,在使用时必须先对组件进行注册。

全局组件通常在入口文件main.js中注册,注册语法:

Vue.component("组件名",组件对象)


局部组件根据需要,在需要使用外部组件的那个组件自身中注册,注册分为两部,先导入目标组件,然后再注册,示例如下:

import CompName from "path of Component"
export default {
    components: {
        // 标签名: CompName,
    }
}


当一个组件被注册好后,该组件就可以在对应的范围内被使用,使用时,将组件名以HTML标签语法进行使用即可:

<!-- 例如,某组件名为TabBar,则使用语法如下 -->
<template>
  <TabBar></TabBar>
</template>


由于组件在使用的时候按照标签语法进行使用,因此强烈建议在注册组件时强烈采用大驼峰命名法,以此来避免和html标签重复,例如有组件名Form的组件,在Vue及React中都是允许的,但是form这样的组件名慎用!


2、组件常用属性


directive

directive,该属性用于自定义指令


除了核心功能默认内置的指令,Vue也允许开发者注册自定义指令。


自定义指令可以分为两种情况:

全局自定义指令【更加实用】

局部自定义指令


当在某个组件内,自身的局部自定义指令与全局自定义指令冲突时,以组件自身的局部自定义指令为准。


指令是帮助我们快速完成某些处理的语法糖,其本质也就是一些拥有固定函数名称的函数集合,这些函数会在特定的时间触发并自动执行,我们称之为钩子函数。指令支持以下钩子函数:

  • bind,当指令首次与标签元素绑定的时候触发
  • inserted,当标签元素被插入完成后触发(与bind的区别在于是否可以获取父节点)
  • update,当标签元素更新时触发
  • componentUpdated,当组件更新完毕后触发
  • unbind,当指令与标签解绑时触发


在自定义指令时,我们必须要根据业务需要从上面几个钩子函数中选取一个或几个合适的钩子函数,并准备好逻辑代码组成一个JavaScript对象。钩子函数支持俩个形参:

  • el:指令宿主对应的DOM对象
  • binding:指令绑定对象,可以通过该对象获取指令的名称、指令表达式等信息


全局自定义指令的注册,通常也是在入口文件main.js中完成,但指令的处理程序在编写的时候允许模块化,也建议采用模块化来保持入口文件中的代码可读性。

Vue.directive("不带v-的指令名",包含指令处理程序的对象)

局部自定义指令通常注册在对应的组件自身,处理程序自身往往也不需要模块化,可以直接写在组件内,当然如果这个指令也需要在其它组件中使用也是可以模块化的:

export default {
    directives: {
        // 不带v-的指令名: 包含指令处理程序的对象,
    }
}


请注意,在自定义指令的方法中,不能像以前的methods中的方法一样使用关键词this,此时this关键词指向undefined

案例:使用自定义指令实现以下效果

  • 使用全局指令定义自定义的`v-color(传参)',在元素被插入时设置内容颜色

例如:<div v-color="'red'">文字</div>

此时指令语法如下:

// 指令实则是一堆钩子函数的集合
// 使用全局指令定义自定义的`v-color(传参)`,在元素被插入时设置内容颜色
const obj = {
  bind (el) {
    // 获取不到父节点
    console.log(el.parentNode)
  },
  inserted (el, binding) {
    console.log(el, binding)
    // 获取父节点
    console.log(el.parentNode)
    el.style.color = binding.value
  }
}
export default obj


需要在入口文件main.js中导入并注册指令:

import color from './directives/color'
// 全局指令注册语法:Vue.directive(指令名,指令对象)
Vue.directive('color', color)


在App.vue文件中测试全局指令的使用:

<template>
  <div>
    <!-- 全局指令测试 -->
    <div v-color="color">青山如故</div>
    <div v-color="'green'">青山如故</div>
    <div v-color="'blue'">青山如故</div>
    <div v-color="'pink'">青山如故</div>
    <div v-color="'orange'">青山如故</div>
    <div v-color="'grey'">青山如故</div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      color: 'red'
    }
  },
}
</script>
<style></style>
  • 使用局部自定义指令实现v-mobile(不传参)验证用户输入的是否是合法的手机号,不合法时将输入框背景色设置成pink,边框设置成red;合法时,边框黑色,背景色白色。


computed


computed,该属性用于定义计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

<div id="example">
  {{ message.split('').reverse().join('') }}
    {{ message.split('').reverse().join('') }}
    {{ message.split('').reverse().join('') }}
</div>


在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,你都应当使用计算属性

如果我们使用一个计算属性,假定计算属性名字叫resverseMessage,那么我们可以将翻转message的工作交给该属性去完成,那么我们视图部分就可以这么写了:

<div id="example">
    <!-- 虽然模版简单了,但是针对数据的处理依然需要在计算属性声明的位置去书写,因此代码实际上没有减少。那么问题来了?我们为什么还推广建议使用计算属性呢? -->
  {{ reserseMessage }}
</div>


计算属性没有全局和局部之分,按照以下语法声明计算属性:

export default {
    computed: {
        // 计算属性名 : Function,
    }
}


计算属性默认只有 getter,不过在需要时你也可以提供一个setter

export default {
    computed: {
        // 计算属性名 : { get: Function, set: Function },
    }
}


  • get:对应的函数在调用该计算属性时被执行
  • set:对应的函数在给该计算属性赋值时被执行,形参为赋的值

计算属性的结果会被缓存,除非依赖的响应式数据变化才会重新计算。注意,如果某个依赖 (比如非响应式 property) 在该实例范畴之外,则计算属性是不会被更新的。


watch

watch,该属性用于定义监听器/侦听器

使用watch来侦听data中数据的变化,watch中的属性(watch是对象格式)一定是data 中已经存在的数据。(特殊情况除外)

使用场景:数据变化时执行异步或开销比较大的操作

**典型应用:**http://www.pinyinzi.cn/

fc3af1797f29dca07fc1fbf57a9ec1f6.png


监听器的语法如下:

export default {
    watch: {
        data中数据属性名: 函数名 | 函数 | 对象 | 回调函数数组,
    }
}


特别需要注意,如果监听的数据是一个对象,则需要使用深度监听语法:

export default {
    watch: {
        data中对象属性名: {
            deep: true,
            handler(val,oldVal){
            }
        }
    }
}


注意,不应该使用箭头函数来定义 watcher 函数


filter

filter,该属性用于定义过滤器

注意:filter仅在Vue2.x中支持,Vue3.x中已废弃,针对后者建议通过computed或methods来替代实现

前端呈现的页面中,不泛很多数据是来自于后端接口请求得到的响应,而有些时候响应给我们的数据格式未必符合我们的要求。例如,如果你做一个功能需要显示一个字符串名单,但是后端给你的名单格式是一个数组,那么此时v-for循环操作不太好操作,而我们需要实现数组字符串的格式转化,这个时候就可以使用过滤器来解决这个问题。


过滤器没有全局和局部之分,哪个组件需要使用则在对应的组件中声明即可,例如:

export default {
    filters: {
        过滤器名: Function,
    }
}


需要注意的是,过滤器对应的函数:

  • 至少有1个形参,形参为待处理的数据(任意格式)
  • 使用过滤器时,如果实参有n个,那么形参应该有n+1个;其中第一形参必定是待处理的数据,而后的形参与实参一一对应(例如:第二个形参对应着第一个实参,第三个形参对应着第二个实参…)
  • 必须有返回值


定义好过滤器后,过滤器就可以与插值表达式一起在视图结构中使用了:

{{表达式 | 过滤器名}}


过滤器可以传递实参:

{{表达式 | 过滤器名(实参1,实参2,...)}}


当然过滤器也可以被连续调用:

{{表达式 | 过滤器名1 | 过滤器名2 | ...}}


理论上来说,只要一个过滤器的表达式有输出,后面就可以继续调用,无长度限制。


mixin

mixin,该属性用于定义混入

mixin是Vue中非常实用的一个功能,它能够实现一些代码片段的复用,它可以将一个混入对象(js普通对象)中的Vue选项混入到被混入的Vue组件中去。混入操作按照类型可以分为:

  • 全局混入,全局混入也可以称之为叫强制混入
  • 局部混入,局部混入也可以称之为叫按需混入

全局混入会将混入对象的选项混入到所有的Vue组件中去,除非项目中每个组件都需要这些Vue选项,否则该操作方式慎用,因为其可能导致其它组件运行不正常。


定义混入对象,混入对象与常规的Vue选项对象的声明基本一致,假设混入对象名称为obj,则:

// 将要复用的选项放到混入对象中去
const obj = {
    methods: {}
    data(){
        return {}
    },
    filters: {
    },
    computed: {
    },
    // ....
}


它不一定需要所有的Vue选项,需要什么根据复用的需求而定,需要复用什么选项写入进去即可。但是由于工程化下整个项目共用一个Vue的el选项,因此混入对象中一般不会有el选项。


全局混入语法:

Vue.mixin(混入对象)


局部混入语法:

export default {
    mixins: [混入对象1,混入对象2,....]
}


在一个混入对象被混入到一个组件的时候,混入对象中的选项可能与组件自身的选项存在冲突的情况,例如混入对象中的data中有一个msg属性,而组件自身的data中也有msg属性,在这种情况下,混入操作会按照固定的合并策略进行冲突合并:


  • 如果冲突发生在data中,则以组件自身的data数据为准
  • 如果是对象属性发生冲突(如methods、computed、filters等)则会合并成一个对象属性,如对象属性中的属性存在同名则以组件自身的为准
  • 如果是钩子函数出现同名冲突,则混入对象中的钩子函数会与本组件自身的钩子函数合并成数组,所有钩子函数均会被执行,但同周期的钩子函数在执行的时候混入对象中的钩子函数会优先于本组件的钩子函数执行
目录
相关文章
|
25天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
127 1
|
5天前
|
JavaScript 安全 API
iframe嵌入页面实现免登录思路(以vue为例)
通过上述步骤,可以在Vue.js项目中通过 `iframe`实现不同应用间的免登录功能。利用Token传递和消息传递机制,可以确保安全、高效地在主应用和子应用间共享登录状态。这种方法在实际项目中具有广泛的应用前景,能够显著提升用户体验。
30 8
|
5天前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
32 1
|
1月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
JavaScript
【Vue】—Vue脚手架创建项目时的 linter / formatter config配置选择
【Vue】—Vue脚手架创建项目时的 linter / formatter config配置选择
|
JavaScript 数据可视化 前端开发
vue脚手架3详细配置,爆肝两天,你可以不用,但是不能不会
vue脚手架3详细配置,爆肝两天,你可以不用,但是不能不会
259 0
vue脚手架3详细配置,爆肝两天,你可以不用,但是不能不会
|
2月前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
106 58
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
59 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
55 1
|
2月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
49 1
vue学习第四章