浅析Vue3中通过v-model实现父子组件的双向数据绑定及利用computed简化父子组件双向绑定

目录
  • 一、vue2 中 sync 修饰符的功能在 vue3 中如何呈现?
    • 1、sync 修饰符回顾
    • 2、sync 的语法糖功能在vue3中如何编写使用?
  • 二、如何通过v-model实现父子组件的双向数据绑定
    • 1、单个数据双向绑定
    • 2、多个数据双向绑定 - 与单数据绑定差别不大
    • 3、利用 computed 简化父子组件双向数据绑定

一、vue2 中 sync 修饰符的功能在 vue3 中如何呈现?

1、sync 修饰符回顾

1、vue 规则:props 是单向向下绑定的,子组件不能修改 props 接收过来的外部数据。

2、如果在子组件中修改 props ,Vue会向你发出一个警告。(无法通过修改子组件的props来更改父组件。)而若需要在子组件更新数据时通知父组件同步更新,需要结合 $emit 和 v-on 实现。

3、而sync修饰符的作用则是简化事件声明及监听的写法。

  如下例子,比较sync和正常修改数据通知外层的写法:可以看到 sync 修饰符确实简便了许多。

// 父组件
<template>
    <div> 数量: {{num}}</div>
    <!-- <ChildComponent :num="num" @increase="num = $event"/> -->
    <ChildComponent :num.sync="num" />
</template>

//子组件
<template>
    <div @click="addNum"> 接收数量: {{num}}</div>
</template>
<script>
export default {
    props: ['num'],
    // data() {
    //    return {
    //        childNum: this.num
    //    }
    // },
    methods: {
        addNum() {
            // this. childNum++
            // this.$emit('increase', this. childNum)
            this.$emit('update:num', this.num + 1)
        }
    }
}

2、sync 的语法糖功能在vue3中如何编写使用?

  vue3 中,通过 v-model:propName 实现自定义组件间数据的双向绑定。使用方法:

(1)父组件通过 “v-model:绑定的属性名” 传递数据属性,支持绑定多个属性;

(2)子组件配置emits,通过 “update:属性名” 的格式定义更新事件

二、如何通过v-model实现父子组件的双向数据绑定

  Vue3父子组件双向数据绑定写法做了些许改变,同时也支持多个数据双向绑定

1、单个数据双向绑定

// 父组件
// v-model 没有指定参数名时,子组件默认参数名是modelValue
<ChildComp v-model="search" />

  需要注意的是:

(1)子组件也并不是直接拿 props 传的变量直接用,而是需要声明一个响应式变量 - 通过 ref(props.modelValue) 声明基于 props 传的变量值为初始化值的响应式数据。

(2)且如果父组件传的是异步数据的话,还需要对其进行监听。

(3)当子组件数据改变时需要通过 emit('update:modelValue', e) 去修改父组件数据实现双向绑定。

<template>
  <div>
    <input v-model="sea" @input="valChange(sea)" />
  </div>
</template>
<script lang="ts">
import { defineComponent, ref, watch } from 'vue'
export default defineComponent({
  name: 'ChildComp',
  props: {
    modelValue: { // 父组件 v-model 没有指定参数名,则默认是 modelValue
      type: String,
      default: ''
    }
  },
  setup (props, { emit }) {
    // input初始化
    const sea = ref(props.modelValue)
    // 如果父组件传过来的数据是异步获取的,则需要进行监听
    watch(() => props.modelValue, () => { sea.value = props.modelValue })
    // 数据双向绑定
    function valChange (e: string) {
      emit('update:modelValue', e)
    }
    return {
      sea,
      valChange
    }
  }
})
</script>

2、多个数据双向绑定 - 与单数据绑定差别不大

// 父组件
<ChildComp v-model="search" v-model:address="addr" />
// 子组件对应为
props: {
  modelValue: { // 父组件 v-model 没有指定参数名,则默认是 modelValue
    type: String,
    default: ''
  },
  address: {  // 父组件 v-model 有指定参数名,则是指定参数名
    type: String,
    default: ''
  }
},

// input初始化
const sea = ref(props.modelValue)
const add = ref(props.address)

// 如果父组件传过来的数据是异步获取的,需要进行监听
watch(() => props.modelValue, () => { sea.value = props.modelValue })
watch(() => props.address, () => { add.value = props.address })

// 数据双向绑定
emit('update:modelValue', e)
emit('update:address', e)

3、利用 computed 简化父子组件双向数据绑定

  上面是通过 ref 声明响应式数据,其实可以通过 computed 计算属性的 get / set 去简化操作。如下:

const props = defineProps({
  modelValue: {
    type: Boolean,
    default: false
  }
})
const emit = defineEmits(['update:modelValue'])
const show = computed({
  get() {
    return props.modelValue
  },
  set(v) {
    emit('update:modelValue', v)
  }
})

到此这篇关于浅析Vue3中通过v-model实现父子组件的双向数据绑定及利用computed简化父子组件双向绑定的文章就介绍到这了,更多相关Vue3父子组件双向绑定内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue3 计算属性computed的实现原理

    目录 computed 的函数签名 computed 的实现 ComputedRefImpl 类 总结 版本:3.2.31 computed 的函数签名 // packages/reactivity/src/computed.ts // 只读的 export function computed<T>( getter: ComputedGetter<T>, debugOptions?: DebuggerOptions ): ComputedRef<T> // 可写的 ex

  • vue3.0中的computed写法

    目录 vue3.0 computed写法 vue3.0 computed的使用及其注意点 为什么使用 使用 注意事项 总结 vue3.0 computed写法 用computed计算属性之前别忘了引入 使用完毕别忘了导出 computed里面还有两个方法:get和set get方法: 结果: get方法是读取数据时候调用的,监测到数据变化以后就自动执行: 结果: 点击以后: 说明get在程序运行时自动调用,后面监测到数据变化就再次调用 我们改一下代码: 点击前结果: 点击后结果: 所以我们能得出

  • Vue3源码解读computed和watch

    目录 computed ComputedRefImpl 小结: watch computed computed和watch在面试中经常被问到他们的区别,那么我们就从源码的实现来看看他们的具体实现 // packages/reactivity/src/computed.ts export function computed<T>( getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>, debugO

  • Vue3 computed初始化获取设置值实现示例

    目录 computed 用法 computed 实现 computed 初始化 computed 获取值的实现 值的展示 缓存功能 computed 设置值实现 computed 用法 本文给大家带来的是vue3 中 computed API的实现. 大家看过vue3的官网,应该都知道,在vue3 的组合式API中,computed这个功能与以往的有所不同了. 以往vue2 的 computed 用法: export default { components: { }, computed: {

  • Vue3中的setup语法糖、computed函数、watch函数详解

    目录 写在前面 setup 语法糖 computed函数 watch 函数 写在最后 写在前面 专栏介绍:凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓得,所谓三大框架使用人数最多,公司选型最多的框架,凉哥之前在文章中也提到过就是 Vue 框架之所以火起来的原因,和 Vue 框架相比其他框架的巨大优势,有兴趣的伙伴可以看一下Vue与React的区别和优势对比,随着 Vue 框架不断的被认可,现如今的 Vu

  • 如何在Vue3中实现自定义指令(超详细!)

    目录 前言 生命周期 钩子的参数 简化形式 对象字面量 在组件上使用指令 几个实用的自定义指令 自动聚焦v-focus 防抖v-debounce 节流v-throttle 弹窗隐藏v-hide 总结 在开发Vue项目时,大多数人都会使用到Vue内置的一些指令,例如v-model.v-if等,在使用的时候不知道有没有想过自己也来实现一个指令呢.本文就以Vue3项目为基础,从原理.方法到实际案例.注意事项,尽可能细致的讲解如何自定义指令. 前言 我们需要明白为什么需要自定义一个指令,其实就是想更加简

  • JavaScript中双向数据绑定详解

    双向数据绑定指的是将对象属性变化绑定到UI,或者反之.换句话说,如果我们有一个拥有name属性的user对象,当我们给user.name赋予一个新值是UI也会相应的显示新的名字.同样的,如果UI包括了一个输入字段用来输入用户名,输入一个新的值会导致user对象中的那么属性发生变化. 许多流行的客户端JavaScript框架例如Ember.js,AngularJS以及KnockoutJS都将双向数据绑定作为自己的头号特性.但是这并不意味着从零开始实现双向数据绑定就很困难,同样的当我们需要双向数据绑

  • 详解vue3中的非父子组件传值

    目录 App.vue sub1.vue sub2.vue 总结 vue2中非父子组件的传值主要是通过事件总线,创建一个vue实例,通过在不同的组件中导入该实例来实现非父子组件之间的通信行为. vue3提供了**provide**和**inject**属性,可以实现非父子组件之间的通信: 假设有三个组件:App.vue(父级).sub1(子级).sub2(子级的子级): App.vue <template> <div style="border: 1px solid pink&q

  • vue3中的父子组件通讯详情

    目录 一.传统的props 二.通过modeValue绑定 三.事件广播(vue3中$on和$emit已废弃),使用新的插件mitt 一.传统的props 通过在父组件中给子组件传值,然后在子组件中通过props接受数据 //父组件 <ValidateInput type="text" v-model="emailVal" :rules='emailRules' placeholder='请输入邮箱地址' ref="inputRef" &g

  • 如何使用Vue3设计实现一个Model组件浅析

    目录 一.组件设计 二.需求分析 三.实现流程 目录结构 组件内容 实现 API 形式 事件处理 其他完善 总结 一.组件设计 组件就是把图形.非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式 现在有一个场景,点击新增与编辑都弹框出来进行填写,功能上大同小异,可能只是标题内容或者是显示的主体内容稍微不同 这时候就没必要写两个组件,只需要根据传入的参数不同,组件显示不同内容即可 这样,下次开发相同界面程序时就可以写更少的代码,意义着更高的开发效率,更少的 Bug和更少的程序体积 二.

  • Vue3中ref与toRef的区别浅析

    1. ref是复制,视图会更新 如果利用ref将某一个对象中的某一个属性值变成响应式数据 我们修改响应式数据是不会影响原始数据的; 同时视图会跟新. ref就是复制 复制是不会影响原始数据的 <template> <div> <div> <div>{{stateObj}}</div> <button @click="func1">按钮</button> </div> </div>

  • Vue3中watchEffect的用途浅析

    前言 vue2里面的 watch api 大家应该都挺熟悉的了, vue2中vue实例里面有一个 $watch 方法 在sfc(sigle file component)里面有一个 watch 选项.他可以实现在一个属性变更的时候,去执行我们想要的行为.比如: 当ID改变的时候,从数据库里面获取新的数据. 当属性变换的时候执行一个动画. 当搜索条件变更的时候,更新查询到的数据. 但是 vue3 除了 watch api, 还新增了一个 watchEffect 的 api, 我们来看看他的用法.

  • vue2与vue3中生命周期执行顺序的区别说明

    目录 vue2与vue3中生命周期执行顺序区别 生命周期比较 简单例子说明 三种情况下的生命周期执行顺序 1.单页面下生命周期顺序 2.父子.兄弟组件的生命周期顺序 3.不同页面跳转时各页面生命周期的执行顺序 vue2与vue3中生命周期执行顺序区别 生命周期比较 vue2中执行顺序 beforeCreate=>created=>beforeMount =>mounted=>beforeUpdate =>updated=>beforeDestroy=>destro

  • 浅析Python中的元编程

    目录 什么是元编程 元编程应用场景 综合实战 什么是元编程 Python元编程是指在运行时对Python代码进行操作的技术,它可以动态地生成.修改和执行代码,从而实现一些高级的编程技巧.Python的元编程包括元类.装饰器.动态属性和动态导入等技术,这些技术都可以帮助我们更好地理解和掌握Python语言的特性和机制.元编程在一些场景下非常有用,比如实现ORM框架.实现特定领域的DSL.动态修改类的行为等.掌握好Python元编程技术可以提高我们的编程能力和代码质量. 想要搞定元编程,必须要理解和

  • 浅析Yii2中GridView常见操作

    本文是小编给大家收集整理些有关网络上GridView出现的大部分问题,本文做一个总结特此分享到我们平台供大家参考. 如果下面有没说到的GridView常见问题,下方留言,我会进行补充. 下拉搜索 日期格式化并实现日期可搜索 根据参数进行是否显示 链接可点击跳转 显示图片 html渲染 自定义按钮 设定宽度等样式 自定义字段 自定义行样式 增加按钮调用js操作 yii2 GridView 下拉搜索实现案例教程 yii2 GridView 日期格式化并实现日期可搜索 案例 是否显示某列案例 我们举一

随机推荐