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>
相关推荐
刘发财1 小时前
弃用html2pdf.js,这个html转pdf方案能力是它的几十倍
前端·javascript·github
牛奶4 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶4 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
Kagol7 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路8 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide8 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter8 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸9 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
Live0000010 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉10 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化