VUE组件化理解(一)组件之间的传值方法调用

VUE组件化理解(一)

父组件传值给子组件

1.属性props

// parent.vue

<template>
  <div class="hello">
    <h1>父组件</h1> 
    <div style="padding-bottom:150px">
      <Children :value='parenttochildren' />
    </div>
  </div>
</template>
<script>
  import Children from './children.vue'
  export default {
    name: 'HelloWorld',
    components: {
      Children
    },
    data() {
      return {
         parenttochildren: '父组件传给子组件的值' 
        // parenttochildren: {
             //   mm:'121',
             //   num:0
        // },
      }
    }
  }
</script>
// children.vue

<template>
  <div>
    <h2>标题:子组件 {{value}}</h2>
    <!-- <h2>标题:子组件 {{value.mm}}</h2> -->
  </div>
</template>
<script>
  export default {
    props: {//接受父组件所传值
      value:{
        type:String, // Object
        required: true,
        default:''
      } 
    },
    data() {
      return {
      }
    }
  }
</script>

props 类型 type 可以是下列原生构造函数中的一个:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

2.子元素$children

当前实例的直接子组件。需要注意 $children 并不保证顺序,也不是响应式的。如果你发现自己正在尝试使用 $children 来进行数据绑定,考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源。

// parent.vue
this.$children[0].xx = xx


子组件传值给父组件

是通过方法传递的,也相当于子组件调用父组件方法:

// parent.vue

<template>
  <div class="hello">
    <h1>父组件</h1>
    <h2 @click='getClick'>获取子组件的值</h2>
    <div style="padding-bottom:150px">
      <Children ref='child' :value='parenttochildren' v-on:getValue='onClick' />
    </div>
  </div>
</template>
<script>
  import Children from './children.vue'
  export default {
    name: 'HelloWorld',
    components: {
      Children
    },
    data() {
      return {
        parenttochildren: '父组件传给子组件的值'
      }
    },
    methods: {
       //得到子组件值方法一:
      onClick(val) {
        //val就是子组件传过来的值
        console.log(val) //传给父组件的值
      },
       //得到子组件值方法二:
      getClick() {
        let end = this.$refs.child.message
        console.log(end) //传给父组件的值
      }
    }
  }
</script>
// children.vue

<template>
  <div>
    <h2 @click='toSendVal'>标题:子组件 {{value}}</h2>
  </div>
</template>
<script>
  export default {
    props: {//接受父组件所传值
      value: {
        type: String,
        required: true,
        default: ''
      }
    },
    data() {
      return {
        message: '传给父组件的值'
      }
    },
    mounted() {
    },
    methods: {
      toSendVal() {
        // getValue是在父组件on监听的方法
        // 第二个参数this.message是需要传的值
        this.$emit('getValue', this.message)
      }
    }
  }
</script>

父子组件方法相互调用:

Vue不提倡用原生的dom操作获取节点,它封装了自己的方法来实现获取dom
做法:
给要获取的dom一个ref属性,起一个名字,通过this.$refs来得到组件里所有有ref属性的dom节点,返回的是一个json

// parent.vue
 <helloworld ref ="hw">< helloworld>
 this.$refs.hw.xx = xx
// parent.vue

<template>
  <div class="hello">
    <h1>父组件</h1>
    <h2 @click='getClick'>调用子组件的方法</h2>
    <div style="padding-bottom:150px">
      <Children ref='child' :value='parenttochildren' :parentGetdata='parentGetdata' v-on:getValue='onClick' />
    </div>
  </div>
</template>
<script>
  import Children from './children.vue'
  export default {
    name: 'HelloWorld',
    components: {
      Children
    },
    data() {
      return {
        parenttochildren: '父组件传给子组件的值'
      }
    },
    methods: { 
      onClick(val) { 
        console.log(val) //传给父组件的值
      }, 
      parentGetdata(){
       console.log('父组件的方法')
      },
      getClick(){ // 父组件调用子组件的方法:
       this.$refs.child.getData() //子组件方法
      } 
    }
  }
</script>
// children.vue

<template>
  <div>
    <h2 @click='toSendVal'>标题:子组件 {{value}}</h2>
    <h3 @click='onClick'>子组件调用父组件的方法</h3>
  </div>
</template>
<script>
  export default {
    props: {//接受父组件所传值
      value: {
        type: String,
        required: true,
        default: ''
      },
      parentGetdata: {
        type: Function,
        default: null
      }
    },
    data() {
      return {
        message: '传给父组件的值'
      }
    },
    mounted() {
    },
    methods: {
      // 子组件调用父组件的方法
      //方法1:
      toSendVal() {
        this.$emit('getValue', this.message)
      }, 
      onClick() {
        // 方法2:
        // this.$parent.parentGetdata()
        //方法3
        if (this.parentGetdata) {
          this.parentGetdata()
        }
      },
      getData() {
        console.log('子组件方法')
      }
    }
  }
</script>

父组件调用子组件的方式:

  • 通过$ref.子组件ref属性名,给子组件定义一个ref属性
    子组件调用父组件的3种方式:
  • 通过$emit
  • 通过 p a r e n t 和 parent和 parentroot
  • 通过父组件把方法传给子组件

非父子组件之间的方法调用(es6方法)

//B模块
import A from 'A的相对路径’
然后调用方法
A.methods.方法函数名()
会改变this指向

**

非父子组件传值

**

建议使用VUEX中共享仓库
this.id = this.$store.state.(sotre中定义的值);
或者
Bus使用空vue实列做中央数据中线;
定义Bus.js

// Bus.js

import Vue from "vue";
var Bus = new Vue();
export default Bus;
在A中,Bus.$emit('getVm',child);
在B中,
Bus.$on('getVm', function (data) {
	self.percent = data.name;
	console.log(self.percent);
})

bus 好像是1.0废弃dispatch和broadcast之后 出来的 解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值