vue3 中v-model语法糖(2024-06-21)


一、 vue2 中 v-model 语法糖

实现父子组件双向数据绑定,一个输入框或者组件指定绑定一个 v-model

1. 父组件写法

javascript 复制代码
<template>
  <div>
    <h1>App</h1>
    <h2>{{ count }}</h2>
    <input type="text" v-model="count" />
    <!-- 展开写法,@input中的 count 的值来自当前输入框事件 -->
    <input type="text" :value="count" @input="count = $event.target.value" />
    <hr />

    <Children v-model="count"></Children>
    <!-- 展开写法,@input中的 count 的值来自子组件输入框中的值 $event.target.value -->
    <Children :value="count" @input="count = $event"></Children>
  </div>
</template>

<script>
import Children from "@/components/Children.vue";
export default {
  components: {
    Children,
  },
  data() {
    return {
      count: "1",
    };
  },
};
</script>

2. 子组件写法

javascript 复制代码
<template>
  <div>
    <h1>main</h1>
    <div>{{ value }}</div>
    <input
      type="text"
      :value="value"
      @input="$emit('input', $event.target.value)"
    />
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
    },
  },
};
</script>

二、 vue2 的 v-bind.sync 修饰符语法糖,实现父子组件双向数据绑定

注意:子组件标签中可以同时使用多个 .sync 修饰符

1. 在父组件中

javascript 复制代码
<template>
  <div>
    <h1>App</h1>
    <input v-model="count" type="text" />
    <hr />
    <Children :count.sync="count"></Children>
    <!-- 展开写法,@update:value中的 count 的值来自子组件输入框中的值 $event.target.value -->
    <Children :count="count" @update:count="count = $event"></Children>
  </div>
</template>

<script>
import Children from "@/components/Children.vue";
export default {
  components: {
    Children,
  },
  data() {
    return {
      count: "1",
    };
  },
};
</script>

2. 在子组件中

javascript 复制代码
<template>
  <div>
    <h1>main</h1>
    <h2>{{ count }}</h2>
    <input
      type="text"
      :value="count"
      @input="$emit('update:count', $event.target.value)"
    />
  </div>
</template>

<script>
export default {
  props: {
    count: {
      type: String,
    },
  },
};
</script>

三、 vue3 的 v-model 语法糖

  1. vue3 中的 v-model 相当于 vue2 中的 v-model 和 v-bind.sync 修饰符组合在一起的产物(择优整合)
  2. v-bind.sync 在 vue3 中被移除了
  3. 可以在组件标签上使用多个 v-model 绑定属性,使用参数区分

1. 在父组件中

javascript 复制代码
<template>
  <div>
    <h1>App</h1>
    <h2>{{ count }}</h2>
    <input type="text" v-model="count" />
    <!-- 此展开写法,仅限于输入框 -->
    <input type="text" :value="count" @input="count = $event.target.value" />
    <hr />
    <Children v-model:count="count"></Children>
    <!-- 此展开写法,仅限于组件 -->
    <Children :count="count" @update:count="count = $event"></Children>
  </div>
</template>

<script>
import Children from "@/components/Children.vue";
import { ref } from "vue";

export default {
  components: {
    Children,
  },
  setup() {
    const count = ref("1");

    return { count };
  },
};
</script>
2. 在子组件中
javascript 复制代码
<template>
  <div>
    <h1>main</h1>
    <div>{{ count }}</div>
    <label>
      count:<input
        type="text"
        :value="count"
        @input="emit('update:count', $event.target.value)"
      />
    </label>
  </div>
</template>

<script>
export default {
  props: {
    count: {
      type: String,
    },
  },
  setup(props, { emit }) {
    console.log(props);
    return { emit };
  },
};
</script>
相关推荐
朦胧之6 小时前
AI 编程-老项目改造篇
java·前端·后端
swipe8 小时前
从 0 到 1 实现大文件上传:分片、秒传、断点续传、暂停、重试与服务端合并
前端·javascript·面试
爱勇宝8 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
甲维斯8 小时前
用AI还原《坦克大战》并3D化升级!
前端·人工智能·游戏开发
IT_陈寒9 小时前
SpringBoot自动配置坑了我一晚上,原来问题出在这
前端·人工智能·后端
kyriewen10 小时前
AI 生成的代码能跑就行?这 5 个坑迟早炸
前端·javascript·ai编程
kisshyshy10 小时前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
谷子在生长10 小时前
纯血鸿蒙自定义弹窗最佳实践:从「到处复制」到「一行调用」
前端·harmonyos
壹方秘境10 小时前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
神秘面具男10 小时前
HarmonyOS 6.0跨端远程控制
前端·后端