vue中v-model的原理是什么?v-model作用在组件上的原理是什么?sync修饰符的原理是什么?

vue中v-model的原理是什么?

特点:双向绑定

数据=>视图

视图=>数据

场景

  1. 收集表单数据
  2. 组件上

原理

v-model只是个语法题,本质是:v-model = v-bind (:value) + v-on (@input)

<template>
  <div id="app">
    <p>{{ text }}</p>
    <input type="text" v-model="text">
    <input type="text" :value="text" @input="(e) => (text = e.target.value)" />
  </div>
</template>

<script>
export default {
  name: "app",
  data() {
    return {
      text: "xxxxxxxx",
    };
  },
};
</script>

<style>
</style>

vue中v-model作用在组件上的原理是什么?

为什么要在组件上使用v-model,我们的目的是?

  1. v-model绑定的变量发生改变,能够影响组件的状态或行为,数据=>视图
  2. 组件内部状态或行为发生变化,能够影响v-model绑定的变量,视图=>数据

怎么做?

v-model其实就是 :value和@input事件的简写

  • 父组件:v-model直接绑定数据
  • 子组件:props通过value接收数据,事件触发 input

例子

App.vue

<template>
  <div id="app">
    <my-select v-model="city">
    </my-select>
  </div>
</template>

<script>

import MySelect from "./components/MySelect.vue";

export default {
  name: "app",
  components: {
    MySelect,
  },
  data() {
    return {
      city: 104,
    };
  },
};
</script>

<style>
</style>

MySelect.vue

<template>
  <div>
    <select :value="value" @change="selectCity">
      <option value="101">北京</option>
      <option value="102">上海</option>
      <option value="103">武汉</option>
      <option value="104">广州</option>
      <option value="105">深圳</option>
    </select>
  </div>
</template>

<script>
export default {
  props: {
    value: String,
  },
  methods: {
    selectCity(e) {
      this.$emit("input", e.target.value);
    },
  },
};
</script>

<style>
</style>

vue中sync修饰符的原理是什么?

.sync 是一个修饰符,用于在自定义组件中实现父子组件之间的双向数据绑定。

.sync主要应用于自定义组件之间的数据传递和状态管理,可以实现父子组件之间的双向数据流。通过 .sync,可以将父组件的数据传递给子组件,并且子组件可以修改这个数据并将修改的结果传递回父组件。

1 子组件改变父组件中的变量值

1.1 不使用sync

我们知道,vue中父组件是使用v-bind(缩写为:)给子组件传入参数,然后子组件通过prop属性接收该参数。此时我们可以给子组件传入一个函数,子组件通过调用传入的函数来改变父组件中参数的值。

在这里插入图片描述

在这里插入图片描述

即主要部分如下所示

<!-- 父组件给子组件传入一个setNum函数 -->
<child :num="numParent" @setNum="(res)=> numParent = res"></child>

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

此时子组件只需要触发changNum函数就能执行父组件中的setNum函数从而改变父组件中numParent的值

1.2 使用sync

上述方法较复杂,使用sync可简化写法

<!-- 父组件给子组件传入一个setNum函数 -->
<child :num.sync="numParent">

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

上述两种方式都可以将numParent的值由222变为666,其中父组件中绑定的参数后面加了一个.sync,子组件中的事件名称被换成了update:age,如下:

  • update:固定部分,vue约定俗成的,注意必须添加update:的前缀才能正确触发事件
  • num是要修改的参数的名称,是我们手动配置的,与传入的参数名字对应起来

2 实现父子组件双向绑定

vue考虑到组件的可维护性,是不允许子组件改变父组件传的props值的。父组件通过绑定属性的方式向子组件传值,而在子组件中可以通过$emit向父组件通信(通过1.1方式),通过这种间接的方式改变父组件的data,从而实现子组件改变props的值。

那么同时,vue中也提供了一种解决方案.sync修饰符(1.2方式)

在这里插入图片描述

允许子组件改变父组件传的props值的。父组件通过绑定属性的方式向子组件传值,而在子组件中可以通过$emit向父组件通信(通过1.1方式),通过这种间接的方式改变父组件的data,从而实现子组件改变props的值。

那么同时,vue中也提供了一种解决方案.sync修饰符(1.2方式)
在这里插入图片描述

Vue,v-model可以绑定到多种表单元素上,包括input、select和textarea等。\[1\]对于input元素,可以通过v-model将数据绑定到其value属性上,例如<input v-model="data" />。\[3\]对于checkbox元素,可以使用v-model将数据绑定到其选状态上,选时v-model绑定的值会被修改为true,否则为false。\[2\]对于radio元素,可以使用v-model将数据绑定到其value属性上,通过选不同的radio按钮来修改v-model绑定的值。\[3\]对于select元素,可以通过v-model将数据绑定到其选的option的value属性上,通过选择不同的option来修改v-model绑定的值。\[3\]此外,v-model还可以结合.lazy、.number、.trim等修饰符来限定其行为。在自定义组件上使用v-model时,其行为会有所不同,类似于sync修饰符,最终展开的结果是一个modelValue属性和一个update:modelValue事件。在Vue3,还可以使用参数形式指定多个不同的绑定,例如v-model:foo和v-model:bar。\[3\]总之,v-modelVue可以绑定到多种表单元素上,提供了方便的双向数据绑定功能。 #### 引用[.reference_title] - *1* [vuev-model双向绑定原理](https://blog.csdn.net/weixin_57322537/article/details/120428298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Vuev-model表单绑定几种实现方式](https://blog.csdn.net/qq_42707967/article/details/115806262)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [vuev-model双向绑定使用和原理](https://blog.csdn.net/m0_67749488/article/details/125289608)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值