一幅长文细学Vue(三)——组件基础(下)

简介: 在本文中年我们会了解什么是props,怎么利用props在父组件和子组件之间传递数据;什么是计算属性,还有什么是事件。

4 组件基础(下)

摘要

​ 在本文中年我们会了解什么是props,怎么利用props在父组件和子组件之间传递数据;什么是计算属性,还有什么是事件。

声明:为了文章的清爽性,在文章内部的代码演示中只会附上部分演示代码,main.js文件的代码通常不贴出,如果感兴趣可以前往代码仓库获取

作者:来自ArimaMisaki创作

[TOC]

4.1 props验证

4.1.1 什么是props验证

说明:如果你想要对外界传入组件的数据进行合法性验证,则原先的props选项使用数组写法没有这个功能,为此,我们改用对象类型的props选项写法。props对象中的键为组件使用者传入数据,值为传入数据的数据类型。


4.1.2 多个可能的类型

说明:对象类型的props选项提供了多种数据验证方案,如

  • 基础的类型检查:直接为组件的prop属性指定基础的校验类型,从而防止组件的使用者为其绑定错误类型的数据
  • 多个可能的类型:如果某个prop属性值得类型不唯一,此时可以通过数组的形式,为其指定多个可能的属性值
  • 必填项校验:prop属性可以是一个prop对象,对象中存在required和type,如果开启required为true,则type对应的数据类型必须满足,否则控制台报错
  • 属性默认值:prop对象还可以存在default,表示该prop属性默认的值。
  • 自定义验证函数:prop对象中可以自定义一个验证函数,从而对prop属性的值进行更加精确的控制。
<template>
  <div>
    <p>数量:{{count}}</p>
    <p>状态:{{state}}</p>
  </div>
</template>

<script>
export default {
    name:'MyCount',
    props:{
        // 必填项校验
        count:{
            type:Number, // 基础类型校验
            required:false,
            default:100 // 默认值
        },
        state:Boolean,
        type:{
            validator(value){
                return ['success','warning','danger'].indexOf(value) !== -1
            }
        }
    }
}
</script>
<template>
    <div>
        <h1>App根组件</h1>
        <hr>
        <MyCount :state="true" type="success"></MyCount>
    </div>
</template>

<script>
import MyCount from './Count.vue';
export default {
    name:'MyApp',
    components:{
        MyCount,
    }
}
</script>


4.2 计算属性

4.2.1 什么是计算属性

说明:我们可以向外暴露computed选项,其可写作对象形式。对象中的每一项都是一个函数,它可以实时监听data中数据的变化,并且return一个计算后的新值。

<template>
    <div>
        <input type="text" v-model.number = "count">
        <p>{{count}}乘以2得:{{plus}}</p>
    </div>
</template>

<script>
export default {
    name:'MyCounter',
    data(){
        return {
            count:1,
        }
    },
    computed:{
        plus(){
            return this.count*2;
        }
    }
}
</script>
<template>
    <div>
        <h1>App根组件</h1>
        <hr>
        <my-counter></my-counter>
    </div>
</template>

<script>
import MyCounter from './MyCounter.vue';
export default {
    name:'MyApp',
    components:{
        MyCounter,
    }
}
</script>


4.2.2 计算属性和方法

疑问:把方法定义在methods节点上不是一样吗,为何非要定义在computed节点上?

解释:相对于方法来说,计算属性会缓存计算的结果,只有计算属性的依赖项发生变化时,才会重新进行计算,因此计算属性的性能更好。


4.3 自定义事件

4.3.1 自定义组件概述

说明:在封装组件时,为了让组件的使用者可以监听到组件内状态的变化,此时需要用到组件的自定义事件。

使用步骤

  1. 声明自定义事件:必须事先在emits节点中声明
  2. 触发自定义事件:通过this.$emit('自定义事件名称')来触发
  3. 监听自定义事件:通过v-on的形式来监听自定义事件


4.3.2 自定义事件传参

说明:如果想要让自定义的事件可以访问到组件的数据,可以在自定义事件从参数列表第二位开始传入参数(第一位是自定义事件名称)。

<template>
  <div>
    <p>Count的值是:{{count}}</p>
    <button @click="add">+1</button>
  </div>
</template>

<script>
export default {
    name:'MyCount',
    emits:['countChange'],
    data(){
        return {
            count:0,
        }
    },
    methods:{
        add(){
            this.count++;
            // 2 触发自定义事件
            this.$emit('countChange',this.count)
        }
    }
}
</script>
<template>
  <div>
    <h1>App根组件</h1>
    <hr>
    <MyCounter @countChange="getCount"></MyCounter>
  </div>
</template>

<script>
import MyCounter from './Counter.vue';
export default {
    name:'MyApp',
    methods:{
        getCount(val){
            alert('触发了'+val+'次事件');
        }
    },
    components:{
        MyCounter,
    }
}
</script>


4.4 组件上的双向绑定

4.4.1 为什么需要在组件上使用v-model

说明:当我们需要维护组件内外数据的同步时,可以在组件上使用v-model指令。


4.4.2 实现组件间的双向绑定

父向子同步:父组件通过v-bind将数据通过props传入子组件

子向父同步:在v-bind指令之前添加v-model指令,并且在子组件中声明emits自定义事件,当触发$emit事件时,更新父组件的数据。

目录
相关文章
|
20小时前
|
设计模式 JavaScript 前端开发
Vue源码学习需要哪些工具和技能
【4月更文挑战第20天】学习Vue源码需具备的工具与技能:VS Code或WebStorm作为代码编辑器,Node.js与npm管理依赖,Git操作仓库。基础包括JavaScript、ES6+语法、前端知识(HTML/CSS/浏览器原理)及Vue基础知识。进阶则需源码阅读理解能力,调试技巧,熟悉设计模式和架构思想。学习方法强调系统学习、实践与持续关注Vue最新动态。
16 8
|
20小时前
|
JavaScript 前端开发 编译器
Vue 源码学习路线
【4月更文挑战第20天】探索Vue源码涉及响应式系统、虚拟DOM、模板编译等核心概念。先掌握Vue基础知识、JavaScript(ES6+)和前端工程化。从源码入口文件开始,研究响应式、虚拟DOM、模板编译、实例方法、全局API及生命周期。理解编译器和渲染器工作原理,实践编写Vue插件,参与开源项目,阅读相关文章教程,持续关注Vue最新动态。这是一个循序渐进、需要耐心和实践的过程。
7 1
|
1天前
|
JavaScript 前端开发 内存技术
Vue入门:构建你的第一个Vue应用程序
【4月更文挑战第22天】Vue.js 入门教程:安装 Node.js 和 npm,使用 Vue CLI (`npm install -g @vue/cli`) 创建项目,选择预设或自定义配置。在 `src/components/` 创建 `HelloWorld.vue` 组件,显示数据属性。在 `App.vue` 中引入并注册组件,启动开发服务器 (`npm run serve`) 预览。开始你的 Vue 之旅!
|
4天前
|
JavaScript
Ant design Vue 父子组件传递(代码案例--不懂的地方可以私信本博主)
Ant design Vue 父子组件传递(代码案例--不懂的地方可以私信本博主)
9 0
|
4天前
|
JavaScript 前端开发
ant design vue 配置菜单外部打开
ant design vue 配置菜单外部打开
12 0
|
4天前
|
JavaScript
ant design vue 在列表中使用插槽 例如当性别为0的时候在列表中我想显示男
ant design vue 在列表中使用插槽 例如当性别为0的时候在列表中我想显示男
7 0
|
4天前
|
JavaScript 前端开发
vue 实现在线预览PDFpdf文件
vue 实现在线预览PDFpdf文件
15 0
|
4天前
|
JavaScript
vue下拉列表
vue下拉列表
10 0
vue下拉列表
|
4天前
|
JavaScript 前端开发 API
vue与jqyery的区别
vue与jqyery的区别
|
5天前
|
JavaScript 前端开发 UED
Vue工具和生态系统: Vue.js和服务器端渲染(SSR)有关系吗?请解释。
Vue.js是一个渐进式JavaScript框架,常用于开发单页面应用,但其首屏加载较慢影响用户体验和SEO。为解决此问题,Vue.js支持服务器端渲染(SSR),在服务器预生成HTML,加快首屏速度。Vue.js的SSR可手动实现或借助如Nuxt.js的第三方库简化流程。Nuxt.js是基于Vue.js的服务器端渲染框架,整合核心库并提供额外功能,帮助构建高效的应用,改善用户体验。
7 0