首页 > 其他分享 >Vue2 子组件参数与父组件的双向绑定

Vue2 子组件参数与父组件的双向绑定

时间:2024-09-23 13:51:36浏览次数:3  
标签:绑定 value Vue2 props 组件 ChildComponent model

在 Vue 2 中,通过props字段可以实现父组件向子组件的单向数据流,在父组件数据发生变化时,会实时地传递给子组件,而子组件无法修改父组件传递的数据。

以下提出的部分方法为网上收集整理资料得出,未经实践,如有错误欢迎指出。

1、不允许直接修改props

如果尝试直接修改props中的参数,会触发 Vue 的警告,并且不会更新父组件的数据。

若尝试修改props中的值,会触发以下警告:

[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "propName"

2、通过引用类型实现对父组件传入参数的修改

若传递的数据为引用类型(对象和数组),子组件可以访问和修改这些对象或数组的内部属性,但直接修改props本身是不被允许的。

3、.sync双向绑定(Vue2.3+版本)

从 Vue 2.3.0 开始,引入了".sync"修饰符,允许在自定义组件中实现双向绑定。".sync"修饰符实际上是一个语法糖,会在内部触发一个update:propName事件并完成数据的更新。

实际上,最原始的方法下,父子组件参数双向绑定的原理是:

1.子组件数据更新,用$emit函数触发名为update:propName的事件,传递更新后的值;

2.父组件定义@update:propName事件,并将更新后的值赋给传给子组件的参数。

.sync完成的是第二步的操作。

.sync修饰符使用示例: 

父组件:

<template>
  <div>
    <ChildComponent :value.sync="parentValue" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentValue: 'Hello from parent'
    };
  }
};
</script>

子组件 :

<template>
  <div>
    <p>{{ value }}</p>
    <input v-model="value" @input="updateValue">Update Value</input>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    value: String
  },
  methods: {
    updateValue() {
      this.$emit('update:value', this.value); // 触发 update:value 事件,更新父组件的数据
    }
  }
};
</script>

3、通过v-model实现数据的双向绑定(Vue 2.6+版本)

从 Vue 2.6.0 开始,v-model的行为有所改进,允许在自定义组件中使用v-model进行双向绑定。v-model默认绑定的是value属性和input事件,但你可以通过model选项来自定义绑定的属性和事件。

实战中发现,部分Vue2.6+版本仍然不支持这个方法。

v-model本质上也是一个语法糖,代码部分为:

<input v-bind:value="propName" v-on:input="propName = $event.target.value" />
<input v-model = "propName" />

v-model使用示例:

父组件:

<template>
  <div>
    <ChildComponent v-model="parentValue" />
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentValue: 'Hello from parent'
    };
  }
};
</script>

子组件:

<template>
  <div>
    <p>{{ value }}</p>
    <input v-model="value" @input="updateValue">Update Value</input>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    value: String // 若设置了多个props的属性,且没有名为value的属性,那么可以通过model设定v-model绑定的值
  },
  model: {
    prop: 'value', // 指定 v-model 绑定的 prop名,若不写则默认为'value'
    event: 'input' // 指定 v-model 触发的事件,若不写则默认为'input'
  },
  methods: {
    updateValue() {
      this.$emit('input', this.value); // 触发 input 事件,更新父组件的数据
    }
  }
};
</script>

 

标签:绑定,value,Vue2,props,组件,ChildComponent,model
From: https://blog.csdn.net/AtlaS_Y/article/details/142454158

相关文章

  • Keepalived核心组件及配置文件解读
    Keepalived是一个用于高可用性(HA,HighAvailability)集群的软件,主要用于Linux环境下。它的主要目的是提高服务器系统的可靠性和可用性,通过在一组服务器之间提供负载均衡和故障转移的功能来实现。简单来说,Keepalived可以帮助你的服务在一台服务器宕机后自动切换到另一台服务器上......
  • vue3常用的组件间通信
    一propsprops可以实现父子组件通信,props数据是只读。1.基本用法在父组件中,你可以这样传递props:<template><ChildComponentmessage="Hello,Vue3!"/></template><scriptsetup>importChildComponentfrom'./ChildComponent.vue';</scrip......
  • k8s集群,master节点的初始化所用到的,init文件的分析,master节点的核心组件的作用,node节
    标准的k8s集群有三个组成部分管理控制节点、计算节点、私有镜像仓库。管理控制节点的功能:提供集群的控制对集群进行全局决策检测和响应集群事件管理控制节点中有四大核心服务服务端口含义用途APIServer6443api接口负责接收请求,实现功能Scheduler......
  • 如何在 ReactJS 中创建可重用的 Button 组件
    按钮无疑是任何react应用程序中重要的ui组件,按钮可能用于提交表单或打开新页面等场景。您可以在react.js中构建可重用的按钮组件,您可以在应用程序的不同部分中使用它们。因此,维护您的应用程序将变得更加简单,并且您的代码将保持dry(不要重复)。您必须首先在组件文件夹中创建一......
  • 在 TypeScript 的类组件的构造函数中是否总是需要定义 `props` 和 `state` ?
    当使用typescript在react中处理类组件时,经常会出现这样的问题:是否有必要且强制在构造函数中定义props和state。这个问题的答案取决于组件的具体需求。在这篇博文中,我们将了解何时以及为何使用构造函数来定义props和状态,以及不同方法的优缺点。使用构造函数何......
  • 在画中画窗口中安装 React 组件
    google在chrome116中引入了documentpictureinpictureapi。在本文中,我们将探讨如何在画中画窗口中安装一个简单的react组件,而无需先将其安装在我们的主应用程序上。第1步-设置组件结构我们制造两个组件。maincomponent.js和counter.js。在maincomponent.js中,我们......
  • 在 React 中管理同一组件的多个实例中的状态
    当您使用react并拥有同一组件的多个实例时,管理状态可能会变得很棘手。根据组件需要交互的方式,您需要以不同的方式处理状态。这是我发现效果很好的方法。独立实例:将状态保留在组件内部如果您的组件不需要相互通信,最好将它们的状态保留在组件内。这样,每个实例都有自己的状态......
  • 使用可重用列表组件扩展 React 应用程序
    在react中构建可扩展的应用程序需要的不仅仅是可靠的业务逻辑。随着应用程序的发展,组件的架构对于其可维护性、性能和灵活性起着重要作用。许多web应用程序中的基本任务之一是处理数据列表。无论是渲染产品列表、表格还是仪表板,您经常会遇到需要可重复和可重用的列表结构的场......
  • 【Ambari自定义组件集成】Bigtop编译大数据组件,看这一篇就够了
    快捷导航在正式内容之前,通过下方导航,大家可以快速找到相关资源:快捷导航链接地址备注相关文档-ambari+bigtop自定义组件集成https://blog.csdn.net/TTBIGDATA/article/details/142150086CSDN地址编译、开发、部署、集成解决方案https://t.zsxq.com/0PVcI知识星球源代码-Ambar......
  • 鸿蒙开发-Swiper(轮播图容器组件)
    Swiper组件提供滑动轮播显示的能力。Swiper本身是一个容器组件,当设置了多个子组件后,可以对这些子组件进行轮播显示。通常,在一些应用首页显示推荐的内容时,需要用到轮播显示的能力。针对复杂页面场景,可以使用Swiper组件的预加载机制,利用主线程的空闲时间来提前构建和布局绘制......