详解vue组件的三大核心概念

【稿件】前言

成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站建设、成都做网站、赤峰网络推广、小程序开发、赤峰网络营销、赤峰企业策划、赤峰品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供赤峰建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

本文主要介绍属性、事件和插槽这三个vue基础概念、使用方法及其容易被忽略的一些重要细节。如果你阅读别人写的组件,也可以从这三个部分展开,它们可以帮助你快速了解一个组件的所有功能。

本文的代码请猛戳github博客,纸上得来终觉浅,大家动手多敲敲代码!

一、属性

1.自定义属性props

prop 定义了这个组件有哪些可配置的属性,组件的核心功能也都是它来确定的。写通用组件时,props 最好用对象的写法,这样可以针对每个属性设置类型、默认值或自定义校验属性的值,这点在组件开发中很重要,然而很多人却忽视,直接使用 props 的数组用法,这样的组件往往是不严谨的。

 
 
 
 
  1. // 父组件  
  2.  
  3.            :type='type'  
  4.            :is-visible="false"  
  5.            :on-change="handlePropChange"  
  6.            :list=[22,33,44]  
  7.            title="属性Demo"  
  8.            class="test1"  
  9.            :class="['test2']"  
  10.            :style="{ marginTop: '20px' }" //注意:style 的优先级是要高于 style  
  11.            style="margin-top: 10px">  
  12.     
  13. // 子组件  
  14.   props: { 
  15.     name: String,  
  16.     type: {  
  17.    //从父级传入的 type,它的值必须是指定的 'success', 'warning', 'danger'中的一个,如果传入这三个以外的值,都会抛出一条警告  
  18.       validator: (value) => {  
  19.         return ['success', 'warning', 'danger'].includes(value)  
  20.       }  
  21.     }, 
  22.  
  23.     onChange: {  
  24.     //对于接收的数据,可以是各种数据类型,同样也可以传递一个函数  
  25.       type: Function,  
  26.       default: () => { }  
  27.     },  
  28.     isVisible: {  
  29.       type: Boolean,  
  30.       default: false  
  31.     },  
  32.     list: {  
  33.       type: Array,  
  34.       // 对象或数组默认值必须从一个工厂函数获取  
  35.       default: () => []  
  36.     }  
  37.   } 

从上面的例子中,可以得出props 可以显示定义一个或一个以上的数据,对于接收的数据,可以是各种数据类型,同样也可以传递一个函数。

2.inheritAttrs

这是2.4.0 新增的一个API,默认情况下父作用域的不被认作 props 的特性绑定将会“回退”且作为普通的 HTML 特性应用在子组件的根元素上。可通过设置 inheritAttrs 为 false,这些默认行为将会被去掉。注意:这个选项不影响 class 和 style 绑定。 上个例子中,title属性没有在子组件中props中声明,就会默认挂在子组件的根元素上,如下图所示: 

3. data与props区别

  • 相同点

两者选项里都可以存放各种类型的数据,当行为操作改变时,所有行为操作所用到和模板所渲染的数据同时都会发生同步变化。

  • 不同点

data 被称之为动态数据,在各自实例中,在任何情况下,我们都可以随意改变它的数据类型和数据结构,不会被任何环境所影响。

props 被称之为静态数据,在各自实例中,一旦在初始化被定义好类型时,基于 Vue 是单向数据流,在数据传递时始终不能改变它的数据类型,而且不允许在子组件中直接操作传递过来的props数据,而是需要通过别的手段,改变传递源中的数据。至于如何改变,我们接下去详细介绍。

4.单向数据流

这个概念出现在组件通信。props的数据都是通过父组件或者更高层级的组件数据或者字面量的方式进行传递的,不允许直接操作改变各自实例中的props数据,而是需要通过别的手段,改变传递源中的数据。那如果有时候我们想修改传递过来的prop,有哪些办法呢?

  • 方法1:过渡到 data 选项中

在子组件的 data 中拷贝一份 prop,data 是可以修改的 。

 
 
 
 
  1. export default {  
  2.   props: {  
  3.     type: String  
  4.   }, 
  5.  
  6.   data () {  
  7.     return {  
  8.       currentType: this.type  
  9.     }  
  10.   }  

在 data 选项里通过 currentType接收 props中type数据,相当于对 currentType= type进行一个赋值操作,不仅拿到了 currentType的数据,而且也可以改变 currentType数据。

  • 方法2:利用计算属性        
 
 
 
 
  1. export default {  
  2.          props: {  
  3.           type: String  
  4.         }, 
  5.  
  6.         computed: {  
  7.           normalizedType: function () {  
  8.              return this.type.toUpperCase();  
  9.            }  
  10.          }  

以上两种方法虽可以在子组件间接修改props的值,但如果子组件想修改数据并且同步更新到父组件,却无济于事。在一些情况下,我们可能会需要对一个 prop 进行『双向绑定』,此时就推荐以下这两种方法:

  • 方法3:使用.sync  
 
 
 
 
  1.  
  2. // 父组件 
  3.  
  4.  
  5.  
  6.  
  7. // 子组件 
  8.  
  9.  
  10.  
  11. // 子组件 
  12.  
  13.  

值得注意:v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名。

2.新语法

在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 `v-slot` 指令)。它取代了 `slot` 和 `slot-scope` 。

我们通过一个例子介绍下默认插槽、具名插槽和作用域插槽的新语法: 

 
 
 
 
  1. // 父组件  
  2.   
  3.         
  4.         

    作用域插槽:item slot-scope {{ props }}

      
  5.         
  6.       
  7.   
  
  •   
  •   
  •  
  •  
  • // 子组件  
  •   
  •    
  • ![slot](https://upload-images.jianshu.io/upload_images/3174701-1e0368524f073643.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)  
  • 参考文章

    浪里行舟:硕士研究生,专注于前端。个人公众号:「前端工匠」,致力于打造适合初中级工程师能够快速吸收的一系列优质文章!

    【原创稿件,合作站点转载请注明原文作者和出处为.com】

    分享标题:详解vue组件的三大核心概念
    标题来源:http://www.gawzjz.com/qtweb/news29/185029.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    软件开发知识

    各行业网站