浅谈Vue 中的 .sync 修饰符有什么用

来自Vue官方文档——sync:在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以变更父组件,且在父组件和子组件都没有明显的变更来源。

 

先确定下两个组件

 

 

 外层红色框的是父组件,绿色框是子组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//子组件Child<br><template>
  <div class="child">
    {{money}}
    <button @click="$emit('update:money', money - 100)">
      <span>花钱</span>
    </button>
  </div>
</template>
 
<script>
export default {
  props: ["money"]
};
</script>
 
 
<style>
.child {
  border: 3px solid green;
}
</style>

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//父组件App<br><template>
  <div class="app">
    App.vue 我现在有 {{ total }}
    <hr />
    <!-- <Child :money="total" v-on:update:money="total = $event"/> -->
    <!-- <Child :money="total" v-on:update:money="editor"/> -->
    <Child :money.sync="total"/>
  </div>
</template>
 
<script>
import Child from "./Child.vue";
export default {
  data() {
    return { total: 10000 };
  },
  components: { Child: Child },
  methods: {
    editor(e) {
      // this.total=this.$event
      this.total = e;
      console.log(e);
    },
  },
};
</script>  

假设有这样一个场景,App是父亲,Child是儿子,Child经常问父亲要零花钱,App响应儿子的需求,给儿子零花钱

1
2
3
4
//Child组件中
<button @click="money = money - 1  ">
      <span>花钱</span>
</button>

  

1、假设儿子自己伸手拿钱,当然这样是不好的,而且也会报错,说什么推荐使用data中的属性或者computed计算,只因为父子传参的prop不能被直接修改,只是造成了一个假象,父亲的存款减少了,其实毛都没少//child

1
2
3
4
5
6
<button @click="$emit('update:money', money - 100)">
      <span>花钱</span>
</button>
 
//App
<Child :money="total" v-on:update:money="total = $event"/> <br><br><Child :money="total" v-on:update:money="editor"/> --><br><br>methods: {<br><br>  editor(e) {<br><br>    this.total = e<br><br>    console.log(e);<br><br>  },<br><br>},

2、所以我们得让儿子触发事件,让父亲接受对应的事件,代码中儿子触发了名为update:money的事件,给这个事件传了名为money-100的参数,然后父亲监听这个update:money的事件,$event就代表着

@click="$emit('update:money', money - 100)"中第二个参数money-100,这个返回值赋给total,达到了再子元素修改父元素值的目的,如果父元素监听中写的不是表达式,而是一个函数editor时,那么调用函数editor时不写括号传参,这个money-100就作为默认的参数传入了
3、那么说到现在.sync到底是干嘛的呢?

1
2
3
4
5
6
7
8
//Child
<button @click="$emit('update:money', money - 100)">
      <span>花钱</span>
</button><br><br>props: ["money"]<br>
//App
<Child :money="total" v-on:update:money="editor"/>
//上下等价
<Child :money.sync="total"/>
  当子组件触发的事件为 
  •   @click="$emit('update:父传给子的参数(props)', 包含---父传给子的参数(props)---的表达式)"
  父组件可以用
  •   :父传给子的参数(props).sync="total" 来监听,并且获取需要的表达式自动执行,达到子元素修改父元素中的值的目的
posted @   时间观测者  阅读(166)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示