Vue sync 和 父子组件传值

1、父组件向子组件传值

  • 给子组件传入一个静态的值:
<test-component child="qwe"></test-component>
  • 传动态的值:
<test-component :child="qwe"></test-component>

子组件要显式的用props选项声明它预期的数据, 如父组件传入未在子组件props定义的值,会传到子组件 $attr 中

2、子组件向父组件传值

实质是父组件向子组件传入事件,再由子组件emit父组件的事件传值

<!-- 父组件 -->
<template>
    <div class="test">
      <test-component @childFn="parentFn"></test-component>
      子组件传来的值 : {{message}}
    </div>
</template>

<script>
export default {
    data: {
        message: ''
    },
    methods: {
       parentFn(payload) {
        this.message = payload;
      }
    }
}
</script>
<!-- 子组件 -->
<template> 
<div class="testCom">
    <input type="text" v-model="message" />
    <button @click="click">Send</button>
</div>
</template>
<script>
export default {
    data() {
        return {
          // 默认
          message: '我是来自子组件的消息'
        }
    },
    methods: {
      click() {
            this.$emit('childFn', this.message);
        }
    }    
}
</script>

3、父子组件相互传值,类似于<input>的 v-model

<!-- 父组件 -->
<template>
    <div class="test">
      <test-component :child.sync="message"></test-component> // sync的用法
    </div>
</template>

<script>
export default {
    data: {
        message: ''
    }
}
</script>
<!-- 子组件 -->
<template> 
<div class="testCom">
    <input type="text" v-model="child" />
    <button @click="click">Send</button>
</div>
</template>
<script>
export default {
    props:['child'],
    methods: {
      click() {
            this.$emit('update:child', '传的值') //通过emit特殊事件传值
        }
    }    
}
</script>

例子2:弹出框(参考网络)

<template>
    <div class="details">
        <myComponent :show.sync='valueChild' style="padding: 30px 20px 30px 5px;border:1px solid #ddd;margin-bottom: 10px;"></myComponent>
        <button @click="changeValue">toggle</button>
    </div>
</template>
<script>
import Vue from 'vue'
Vue.component('myComponent', {
      template: `<div v-if="show">
                    <p>默认初始值是{{show}},所以是显示的</p>
                    <button @click.stop="closeDiv">关闭</button>
                 </div>`,
      props:['show'],
      methods: {
        closeDiv() {
          this.$emit('update:show', false); //触发 input 事件,并传入新值
        }
      }
})
export default{
    data(){
        return{
            valueChild:true,
        }
    },
    methods:{
        changeValue(){
            this.valueChild = !this.valueChild
        }
    }
}
</script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值