• vue之父子组件传值、以及验证父子组件传值的合法性


    vue之父子组件传值

    一、父组件给子组件传值

    1. 父组件给子组件传值

    注意:传值时,传递的参数最好不要和子组件里已有的参数名冲突。

    并且也可以传方法,传方法时不要加扩号,扩号意味着执行。

    而且还可以把父组件整个实例传递过去

    1.1 传递属性

    a.父组件调用子组件的时候,绑定动态属性;

    <v-header :title="title"></v-header>

    b.在子组件的export default 里面通过props接收父组件穿过来的数据

    <script>
      export default {
        name:"header",
        data(){
          return {
          }
        },
        props:["title"]
      }
    </script>

    结果:

     

    1.2 传递方法

    a.父组件调用子组件的时候,绑定动态方法;

    //home.vue
    <template>
      <div>
        <v-header :title="title" :homeFun="homeFun"></v-header>
        首页组件
      </div>
    </template>
    
    <script>
    
      import Header from './Header'
      export default {
        name:"home",
        data(){
          return {
            msg:"我是一个home组件",
            title:"首页"
          }
        },
        methods:{
          homeFun(){
            console.log(this.msg)
          }
        },
        components:{
          'v-header':Header
        }
    
      }
    </script>
    
    //Header.vue
    <template> <div> <h2>我是头部组件</h2> <h4>{{title}}</h4> <button @click="homeFun()">执行父组件的fun方法</button> </div> </template> <script> export default { name:"header", data(){ return { msg:"6666" } }, props:["title","homeFun"] } </script>

    结果:

    1.3 传递父组件整个实例

    a.父组件调用子组件的时候,绑定this;

    #home.vue
    
    <template>
      <div>
        <v-header :title="title" :homeFun="homeFun" :home="this"></v-header>
        首页组件
      </div>
    </template>
    
    
    
    #Header.vue
    
    <template>
      <div>
        <h2>我是头部组件</h2>
        <h4>{{title}}</h4>
        <button @click="homeFun()">执行父组件的fun方法</button>
        <button @click="getParent()">父组件实例</button>
      </div>
    
    </template>
    
    
    <script>
      export default {
        name:"header",
        data(){
          return {
            msg:"6666"
          }
        },
        methods:{
          getParent(){
            console.log(this.title);
            console.log(this.msg)
          }
        },
        props:["title","homeFun","home"],
    
      }
    </script>

    结果:

    注意:

    当使用this时,只有当子组件中没有所用变量是才会去使用父组件的变量,比如msg在子组件已经存在,所以在使用的使用直接使用的是子组件的msg,也就是6666.如果想要使用父组件的msg可以这样:

    console.log(this.home.msg)

    如:

    2. 子组件验证父组件传过来的值的合法性

    子组件在接收父组件的传值时 props的值 就不单单只是一个列表里加名称了。而是一个字典套对象

    用法如下:

    props: {
        // 基础的类型检查 (`null` 匹配任何类型)
        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 将会产生一个控制台的警告。具体可看官网说明。

    二、父组件主动获取子组件的数据和方法

    1.步骤

    a.调用子组件的时候定义一个ref

    <v-header ref="header"></v-header>

    b.在父组件里通过以下方式来使用

    this.$refs.header.属性
    
    this.$refs.header.方法

    2.演示1:获取子组件属性msg

    #home.vue
    
    <template>
      <div>
        <v-header ref="header"></v-header>
        首页组件
        <button @click="getChildData()">主动获取子组件的属性和方法</button>
      </div>
    </template>
    
    <script>
    
      import Header from './Header'
      export default {
        name:"home",
        data(){
          return {
            msg:"我是一个home组件",
            title:"首页"
          }
        },
        methods:{
          getChildData(){
            console.log(this.$refs.header.msg)
          }
        },
        components:{
          'v-header':Header
        }
    
      }
    </script>
    
    
    #header.vue
    
    <template>
      <div>
        <h2>我是头部组件</h2>
    
      </div>
    
    </template>
    
    
    <script>
      export default {
        name:"header",
        data(){
          return {
            msg:"6666"
          }
        },
    
    
      }
    </script>

    结果:

    演示2:获取子组件的方法

    #home.vue
    
    <template>
      <div>
        <v-header ref="header"></v-header>
        首页组件
        <button @click="getChildData()">主动获取子组件的属性和方法</button>
      </div>
    </template>
    
    <script>
    
      import Header from './Header'
      export default {
        name:"home",
        data(){
          return {
            msg:"我是一个home组件",
            title:"首页"
          }
        },
        methods:{
          getChildData(){
            console.log(this.$refs.header.msg);
            this.$refs.header.run()
          }
        },
        components:{
          'v-header':Header
        }
    
      }
    </script>
    
    
    
    #header.vue
    
    <template>
      <div>
        <h2>我是头部组件</h2>
    
      </div>
    
    </template>
    
    
    <script>
      export default {
        name:"header",
        data(){
          return {
            msg:"6666"
          }
        },
        methods:{
          run(){
            console.log("我是子组件的方法")
          }
        }
    
    
      }
    </script>

    结果:

     三、子组件主动获取父组件的属性和方法

    1.步骤

    直接在子组件中使用下面命令:

    this.$parent.属性
    
    this.$parent.方法

    2.演示

    #home.vue
    
    <template>
      <div>
        <v-header ref="header"></v-header>
        <hr />
        首页组件
        <br />
        <button @click="getChildData()">主动获取子组件的属性和方法</button>
      </div>
    </template>
    
    <script>
    
      import Header from './Header'
      export default {
        name:"home",
        data(){
          return {
            msg:"我是一个home组件",
            title:"首页"
          }
        },
        methods:{
          getChildData(){
            console.log(this.$refs.header.msg);
            this.$refs.header.run()
          },
          run(){
            console.log("我是home组件的方法")
          }
        },
        components:{
          'v-header':Header
        }
    
      }
    </script>
    
    
    #header.vue
    
    <template>
      <div>
        <h2>我是头部组件</h2>
        <button @click="getParentData()">主动获取父组件的属性和方法</button>
      </div>
    
    </template>
    
    
    <script>
      export default {
        name:"header",
        data(){
          return {
            msg:"6666"
          }
        },
        methods:{
          run(){
            console.log("我是子组件的方法")
          },
          getParentData(){
            console.log(this.$parent.msg);
            this.$parent.run()
          },
        }
    
    
      }
    </script>

    结果:

  • 相关阅读:
    jquery easyui-datagrid手动增加删除重置行
    jsp中一行多条数据情况
    JQuery操作下拉框
    解决juqery easyui combobox只能选择问题
    oracle中WMSYS.WM_CONCAT函数的版本差异
    oracle wm_concat(column)函数的使用
    Javascript九大排序算法详解
    C#和VB新版本的最新特性列表
    Oracle中如何区别用户和模式
    远程控制数据库实用SQL重启功能
  • 原文地址:https://www.cnblogs.com/zhangjunkang/p/10148565.html
Copyright © 2020-2023  润新知