IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue使用model属性实现父子组件v-model双向绑定数据同步访问。 -> 正文阅读

[JavaScript知识库]vue使用model属性实现父子组件v-model双向绑定数据同步访问。

应用场景:

1、复杂的子组件需要抽出来封装,父组件提交的时候需访问子组件的变量值。
2、在表单中,子组件为input、select等控件需要在父组件提交时候做表单验证时需要触发子组件的表单验证。
3、多层级组件嵌套传值同步较为复杂时用到。

常用场景暂时只想到这么多,欢迎大家来补充。

实现原理

官网介绍

https://cn.vuejs.org/v2/api/#model

允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。

简单来说就是父组件改变值,子组件的值会改变,子组件改变值,父组件的值也会改变;就是将父子组件实现数据双向绑定的效果。

上示例

父组件

<template>
  <div>
      <son v-model='formData.value'></son>
      <button @click="changeVal">点击变化value</button>
  </div>
</template>
<script>
import son from "./son.vue"
export default {
  components: {
      son
  },
  name: 'father',
  data(){
      return {
        formData:{} //一个form对象 表单验证正常写法
      }
    },
  watch :{
    value (val) {
      console.log( '父组件看见的' + val)
    }
  },
  methods:{
    changeVal () {
      this.formData.value = '父组件事件改变了传值'
    }
  },
}
</script>

父组件给子组件绑定v-model=‘formData.value’,同时通过一个点击事件changeVal去改变传给子组件的值。

子组件

<template>
  <div>
    <input type="text" v-model="childValue" @input="childInputChange"/>
  </div>
</template>
<script>

export default {
  name: 'son',
  model: {  // 定义model
        	// 父组件v-model绑定的值传递给props中的fatherValue
            prop: 'fatherValue',  
            // 通过emit触发childValueChange将内部值传递给父组件v-model绑定的值
            event: 'childValueChange'  
        },
  props:{
      fatherValue:{ // 接受父组件传递的值
        type: String,
        default:''
      }  
    },
  data () {
    return {
      childValue: this.fatherValue// 关联值
    }
  },
  watch :{
    fatherValue (val) { //这一步重新赋值 是因为props里面的fatherValue改变了 但是data里面的childValue不会改变 从而视图不会更新
      console.log( '父组件看见的' + val)
      this.childValue = val
    }
  },
  methods:{
     childInputChange(){ 
        // 通过$emit触发childValueChange(model内定义)事件,将内部值传递给给父组件
        this.$emit('childValueChange', this.childValue)
    }
  },
}
</script>

子组件定义props;值为fatherValue,这个值就是父组件的formData.value,子组件在data里面定义关联值childValue: this.fatherValue ,然后通过@input事件用$emit传值给父组件。 ——(注意:这里使用关联值是因为;vue的父子组件传参,子组件是不能够直接修改props的值达到父组件值也改变的效果)——

最后我们通过监听数据变化就可以在父子组件同时拿到相同的变量。

在这里插入图片描述

项目中会经常碰到这种父子组件交互的情况,通过model属性会方便不少。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 16:49:40  更:2022-06-26 16:50:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:10:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码