彻底明白VUE修饰符sync

╰半橙微兮° 2023-02-08 15:52 73阅读 0赞

https://www.jianshu.com/p/d42c508ea9de

官方推荐使用一种update:my-prop-name 的模式来替代事件触发,目的是为了优雅而不粗鲁的实现父子组件间的双向绑定!先来完成一个小功能:通过父组件按钮将子组件显示出来,如图:

aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMjAxNTk3MC1lNWQyYWI2NDQ2YzZhMDY3LmdpZj9pbWFnZU1vZ3IyL2F1dG8tb3JpZW50L3N0cmlwfGltYWdlVmlldzIvMi93LzUxMS9mb3JtYXQvd2VicA

父组件代码:

  1. <template>
  2. <div>
  3. <input type="button"
  4. value="我是父组件中的按钮"
  5. @click="show">
  6. <child v-show="isShow"/>
  7. </div>
  8. </template>
  9. <script>
  10. import child from "@/components/child"
  11. export default {
  12. data() {
  13. return {
  14. isShow:false
  15. }
  16. },
  17. components:{
  18. child
  19. },
  20. methods:{
  21. show(){
  22. this.isShow=true;
  23. }
  24. }
  25. }
  26. </script>

子组件child代码:

  1. <template>
  2. <div>
  3. 我是一个子组件,我在红色的海洋里!
  4. </div>
  5. </template>

接下来加个需求,在子组当中增加一个按钮,通过该按钮来将自已隐藏起来!需要借助父子之间的传值了!如图:

aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMjAxNTk3MC01MGZiM2U3MTIxNTg3OTg4LmdpZj9pbWFnZU1vZ3IyL2F1dG8tb3JpZW50L3N0cmlwfGltYWdlVmlldzIvMi93LzUxMS9mb3JtYXQvd2VicA

父组件代码:

  1. <template>
  2. <div>
  3. <input type="button"
  4. value="我是父组件中的按钮"
  5. @click="show">
  6. <child @upIsShow="changeIsShow" v-show="isShow"/>
  7. </div>
  8. </template>
  9. <script>
  10. import child from "@/components/child"
  11. export default {
  12. data() {
  13. return {
  14. isShow:false
  15. }
  16. },
  17. components:{
  18. child
  19. },
  20. methods:{
  21. show(){
  22. this.isShow=true;
  23. },
  24. changeIsShow(bol){
  25. this.isShow=bol;
  26. }
  27. }
  28. }
  29. </script>

子组件代码:

  1. <template>
  2. <div>
  3. 我是一个子组件,我在红色的海洋里!
  4. <input type="button" value="点我隐身" @click="upIsShow">
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. methods:{
  10. upIsShow(){
  11. this.$emit("upIsShow",false);
  12. }
  13. }
  14. }
  15. </script>

如果我要将父组件中的事@upIsShow修改为@update:isShow不违法吧:

  1. <child @update:isShow="changeIsShow" v-show="isShow"/>

子组件的emit自然也要做对应调整:

  1. upIsShow(){
  2. this.$emit("update:isShow",false);
  3. }

运行一下,一切正常!真好!

那么如果现在我将父组件的changeIsShow直接写成匿名函数,也能运行吧:

  1. <child @update:isShow="function(bol){isShow=bol}" v-show="isShow"/>

再次运行,一切还是那么美好,真好!

现在我将那匿名函数改成箭头函数,不过分吧:

  1. <child @update:isShow="bol=>isShow=bol" v-show="isShow"/>

再运行一次,完美,真好!

最后我将上面那行代码做最后一次修改:

  1. <child :isShow.sync="isShow" v-show="isShow"/>

至此终于涉及到了sync了。以上代码 :isShow.sync=”isShow”其实是 @update:isShow=”bol=>isShow=bol”语法糖。是其一种简写形式。附上完整代码。
父组件:

  1. <template>
  2. <div>
  3. <input type="button"
  4. value="我是父组件中的按钮"
  5. @click="show">
  6. <child :isShow.sync="isShow" v-show="isShow"/>
  7. </div>
  8. </template>
  9. <script>
  10. import child from "@/components/child"
  11. export default {
  12. data() {
  13. return {
  14. isShow:false
  15. }
  16. },
  17. components:{
  18. child
  19. },
  20. methods:{
  21. show(){
  22. this.isShow=true;
  23. },
  24. changeIsShow(bol){
  25. this.isShow=bol;
  26. }
  27. }
  28. }
  29. </script>

子组件:

  1. <template>
  2. <div>
  3. 我是一个子组件,我在红色的海洋里!
  4. <input type="button" value="点我隐身" @click="upIsShow">
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. methods:{
  10. upIsShow(){
  11. this.$emit("update:isShow",false);
  12. }
  13. }
  14. }
  15. </script>

最后:sync只是给大家伙提供了一种与父组件沟通的思路而已!所以在后面日子里,你如果只是单纯的在子组件当中修改父组件的某个数据时,建议使用sync,简单,快捷,有档次!真好!

—————END—————

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue之.sync修饰符

    根据VUE官方文档所述,.sync修饰符用来prop双向绑定,而.sync修饰符类似v-model,只是一个语法糖 ![在这里插入图片描述][watermark_type_

    相关 .sync修饰符

    第一步:先用一句话解释 .sync修饰符可以实现子组件与父组件的双向绑定,并且可以实现子组件同步修改父组件的值。 第二步:具体解释 一般情况下,想要实现父子组件间