zoukankan      html  css  js  c++  java
  • 从零开始学VUE之组件化开发(父子组件的通信)

    父子组件的通信

    为什么需要通信

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

    如何通信

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

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

    <!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 中的值提供一个带有验证需求的对象,而不是一个字符串数组。

    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 检测

    <!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:驼峰命名问题]

    <!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>

    运行效果

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

    <!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>

    运行结果

    作者:彼岸舞

    时间:202162

    内容关于:VUE

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

  • 相关阅读:
    Android服务器——TomCat服务器的搭建
    Ubuntu16.04 Liunx下同时安装Anaconda2与Anaconda3
    android中代码操作外部SD卡出错:W/System.err(1595): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
    查准率与查全率(precision and recall) 的个人理解
    Python游戏-实现键盘控制功能
    UGUI世界坐标转换为UI本地坐标(游戏Hud的实现)
    LoadRunner中遭遇交互数据加密的处理方案
    [Java]链表的打印,反转与删除
    优化程序性能(3)——提高并行性
    基本排序算法的python实现
  • 原文地址:https://www.cnblogs.com/flower-dance/p/14841253.html
Copyright © 2011-2022 走看看