前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始学VUE之组件化开发(父子组件的通信)

从零开始学VUE之组件化开发(父子组件的通信)

作者头像
彼岸舞
发布2021-06-07 17:36:48
1.7K0
发布2021-06-07 17:36:48
举报
文章被收录于专栏:java开发的那点事

父子组件的通信

为什么需要通信

  • 在开发中往往一些数据确实需要下面的子组件进行展示
    • 比如在一个页面中,我们从服务器请求了很多的数据,其中一部分数据并不是页面的大组件来展示的,而是需要下面的子组件进行展示,这个时候肯定不会让子组件再次调用网络请求,而是直接让大组件(父组件)将数据传递给小组件(子组件)

如何通信

  • 父组件通过props属性将数据传递给子组件
  • 子组件通过自定义事件向父组件传递数据

父组件向子组件传递数据[props:字符串数组类型]

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--    静态传值-->
    <cpn ctitle="title" cmovies="movies"></cpn>
<!--    动态传值-->
    <cpn :ctitle="title" :cmovies="movies"></cpn>
</div>
</body>
<template id="cpn">
    <div>
        {{ctitle}}
        {{cmovies}}
    </div>
</template>
<script>

    const cpn = {
        template:'#cpn',
        // 使用数组进行传值 在里面声明需要传输数据的key,在使用的时候通过属性就可以传递值了
        props:[
            'ctitle',
            'cmovies'
        ]
    }

    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {
            title:'this is title',
            movies: ['spring','springboot','springmvc','springData']
        },
        components:{
            // ES6 增强KEY 不写KEY 默认和值 一致
            cpn
        }
    })
</script>
</html>

运行效果

父组件向子组件传递数据[props:对象(带验证)]

组件可以为 props 指定验证要求。

为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组。

代码语言:javascript
复制
props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    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 ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  }

当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。

type(验证类型) 可以是下面原生构造器:

String

Number

Boolean

Array

Object

Date

Function

Symbol

type 也可以是一个自定义构造器,使用 instanceof 检测

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
    <cpn :ctitle="title" :cmovies="movies"></cpn>
</div>
</body>
<template id="cpn">
    <div>
        {{ctitle}}
        {{cmovies}}
    </div>
</template>
<script>

    const cpn = {
        template:'#cpn',
        // 使用对象进行传值可以对key的value进行校验
        props: {
            ctitle:{
                // 类型为String 如果可能是多个采用 字符串数组
                type:String,
                // 是否必传
                required:true,
                // 默认值
                default:'没有传递数据'
            },
            cmovies:{
                // 可能是多个值
                type:[Array,Object],
                // 不是必填
                required: false,
                // 数组和对象的默认值必须由函数返回
                default(){
                    return [];
                }
            }
        }
    }

    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {
            title:'this is title',
            movies: ['spring','springboot','springmvc','springData']
        },
        components:{
            // ES6 增强KEY 不写KEY 默认和值 一致
            cpn
        }
    })
</script>
</html>

运行效果

父组件向子组件传递数据[props:驼峰命名问题]

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
<!--    采用大写将接收不到值-->
    <h2>cTitle</h2>
    <cpn :cTitle="title"></cpn>
<!--    自动转换 cTitle->c-title-->
    <h2>c-title</h2>
    <cpn :c-title="title"></cpn>
</div>
</body>
<template id="cpn">
    <div>
        {{cTitle}}
    </div>
</template>
<script>

    const cpn = {
        template:'#cpn',
        // 使用对象进行传值可以对key的value进行校验
        props: {
            // 使用驼峰命名时,在属性传值的时候会自动将驼峰转为中横线+小写
            cTitle:{
                // 类型为String 如果可能是多个采用 字符串数组
                type:String,
                // 默认值
                default:'没有传递数据'
            }
        }
    }

    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {
            title:'this is title'
        },
        components:{
            cpn
        }
    })
</script>
</html>

运行效果

子组件向父组件传递数据[自定义事件]

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../../../js/vue.js"></script>
</head>
<body>
<div id="app">
    <!--不是cli中 暂时不要写驼峰 因为我写了转 成中横线和小写也不行,暂时就全写小写 -->
    <!--@querybyitemname 这个事件就是自定义事件 通过子组件使用$.emit发射出来的-->
    <cpn @querybyitemname="queryByItemName"></cpn>
</div>
</body>
<template id="cpn">
    <div>
        <button v-for="item in categories" @click="itemClick(item)">{{item.name}}</button>
    </div>
</template>
<script>

    const cpn = {
        template: '#cpn',
        data() {
            return {
                categories: [
                    {id: 'a', name: '热门推荐'},
                    {id: 'b', name: '手机数码'},
                    {id: 'c', name: '家用电器'},
                    {id: 'd', name: '电脑办公'}
                ]
            }
        },
        methods: {
            itemClick(item) {
                // 通过自定义事件'querybyitemname'方法并传递参数'item',需要在组件调用的时候通过@也就是v-on监听
                this.$emit('querybyitemname', item);
            }
        }
    }

    // 创建vue
    const vue = new Vue({
        el: '#app',
        data: {},
        methods: {
            // 用于子组件调用
            queryByItemName(item) {
                console.log(JSON.stringify(item));
            }
        },
        components: {
            cpn
        }
    })
</script>
</html>

运行结果

作者:彼岸舞

时间:2021\06\02

内容关于:VUE

本文属于作者原创,未经允许,禁止转发

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 父子组件的通信
    • 为什么需要通信
      • 如何通信
        • 父组件向子组件传递数据[props:字符串数组类型]
          • 父组件向子组件传递数据[props:对象(带验证)]
            • 父组件向子组件传递数据[props:驼峰命名问题]
              • 子组件向父组件传递数据[自定义事件]
              相关产品与服务
              云服务器
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档