理解vue中的.sync和.$emit

首先来说一下 .sync 修饰符的作用

第一步:先用一句话解释
.sync修饰符可以实现子组件与父组件的双向绑定,并且可以实现子组件同步修改父组件的值。

第二步:具体解释
一般情况下,想要实现父子组件间值的传递,通常使用的是 props 和自定义事件 $emit 。
其中,父组件通过 props 将值传给子组件,子组件再通过 $emit 将值传给父组件,父组件通过事件j监听获取子组件传过来的值。
如果想要简化这里的代码,可以使用.sync修饰符,实际上就是一个语法糖。

当我们需要通过子组件改变父组件的值时,可以这么实现
<!-- 父组件给子组件传入一个setNum函数 -->
<child :num="numParent" @setNum="(res)=> numParent = res"></child>

//子组件通过调用这个函数来实现修改父组件的状态
methods: {
    changNum(){
      this.$emit('setNum',666)
}

此时子组件只需要触发changNum函数就能执行父组件中的setNum函数从而改变父组件中numParent的值
这么写的话,比较麻烦

我们可以使用sync可简化写法:

在这里插入图片描述
在这里插入图片描述
这样就可以实现通过点击子组件按钮改变父组件中numParent的值了,比较便捷

接下来,来说一下$emit

父组件中

<template>
  <div>
    <!-- 组件间的参数传递 -->
    <!-- 父子传递 -->
    <!-- 传递方法给子元素: 通过事件传递 @事件名="值" -->
    <!-- 事件名随便起,不要跟系统重复即可: aabb是自定义名称, 不需要提前声明 -->
    <my-son :num="num" @aabb="receiveMsg" />
    <p>
      <button @click="num++">num:{{ num }}</button>
    </p>
    <!-- 子父传递 -->
    <p>子喜欢的队伍: {{ msg }}</p>
    <!-- 兄弟传递 -->
    <!-- 随意关系传递: 事件总线 + vuex 方式 -->
  </div>
</template>

<script>
import MySon from './components/MySon.vue'
export default {
  components: { MySon },
  data() {
    return {
      num: 1,
      msg: '',
    }
  },
  methods: {
    // 父制作一个方法, 用于接收子消息
    receiveMsg(msg) {
      console.log('来自子的消息:', msg)
      this.msg = msg
    },
  },
}
</script>

<style lang="scss" scoped></style>

子组件

<template>
  <div class="box">
    <h2>我是App的子元素</h2>
    <p>来自父元素的num: {{ num }}</p>
    <hr />
    <!-- vue的设计理念: 单向数据流 -- 父和子主动交流, 不允许子主动联系父 -->
    <!-- 1. 需要父提供一个方法,通过事件传递给子元素 -->
    <!-- 2. 然后子元素通过父提供的方法, 来传递数据 -->
    <h3>选择你喜欢的队伍:</h3>
    <button @click="chooseTeam('WBG')">WBG</button>
    <button @click="chooseTeam('EDG')">EDG</button>
    <button @click="chooseTeam('V5')">V5</button>
  </div>
</template>

<script>
export default {
  // props: 声明属性, 接收父传递的值
  props: ['num'],
  methods: {
    chooseTeam(name) {
      // 官方不推荐,但是用的较多:  因为更加简单粗暴
      // $parent: 属性中存储当前组件的父元素
      // 可以直接修改父元素中的属性值, 违背了官方的 单向数据流 原则, 但好用
      // this.$parent.msg = name

      // console.log(this)
      // 当前组件的自定义事件 @aabb 保存在 this.$listeners 中
      // 触发 aabb 中存储的函数(即父提供的 receiveMsg 函数)
      this.$emit('aabb', name)
      // $emit: 触发事件, 相当于:  参数1(参数2), 即 aabb(name)
      // $emit: 专门用于触发自定义事件
      // <组件 @自定义事件名="..."/>
    },
  },
}
</script>

<style lang="scss" scoped>
.box {
  border: 3px solid blue;
  padding: 10px;
}

我直接也写过组件之间是怎么传参的,这些都是很基础的,上手vue必须要学会哦,当然如果能看懂源码会有很大的帮助

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多看书少吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值