Vue 父子组件通信v-model .sync修饰符

2023-11-17

一、 v-model简化父子组件通信

v-model是什么?

v-model 是Vue框架的一种内置的API指令,本质是一种语法糖写法。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

v-model实现表单的双向绑定

<template>
  <div>
    <input type="text"
           v-model="msg">
    <p>{{msg}}</p>
  </div>
</template>
<script>
export default {
  data () {
    return {
      msg: ''
    }
  }
}
</script>

原理:v-model是v-bind和v-on:input的结合,即监听了表单的input事件,然后修改value属性对应的值

完整代码可写为:

<template>
  <div>
    <input type="text"
           :value="msg"
           @input="bind">
    <p>{{msg}}</p>
  </div>
</template>
<script>
export default {
  data () {
    return {
      msg: ''
    }
  },
  methods: {
    bind () {
      this.msg = event.target.value
    }
  }
}
</script>
简化父子通信代码

普通写法

父组件(App.vue)

<template>
  <div class="wrapper">
    <!-- 自定义属性可以随意指定名字,自定义事件名称也可以随意指定 -->
    <select-comp :value='selectId' @input="selectId=$event"></select-comp> 
    {{ selectId }}
  </div>
</template>

<script>
import SelectComp from './components/SelectComp.vue'
export default {
  name: 'App',
  data() {
    return{
      selectId:'1001',

     }
  },
  components: {
    SelectComp,

  },
  methods: {},
}
</script>
<style lang="less" scoped></style>

子组件(SelectComp.vue)

<template>
  <!-- 
    selectId这个数据从父亲传递过来的,不能直接修改 所以不能使用v-model绑定数据
    要想改变从父亲传递过来的数据 采用子传父
 -->
  <select :value="value"  @change='changeOption'>
    <option value="1001">北京</option>
    <option value="1002">上海</option>
    <option value="1003">广州</option>
    <option value="1004">深圳</option>
  </select>
</template>

<script>
export default {
  data() {
    return {};
  },
  props: {
    value:{
        type: String,
        required: true
    }
   
  },
   methods: {
        changeOption(e){
            this.$emit('input',e.target.value)
        }
    }
};
</script>
<style>
</style>

v-model简化写法
父组件(App.vue)

<template>
  <div class="wrapper">
    <!-- 自定义属性可以随意指定名字,自定义事件名称也可以随意指定 -->
    <select-comp v-model="selectId"></select-comp> 
    {{ selectId }}
  </div>
</template>

<script>
import SelectComp from './components/SelectComp.vue'
export default {
  name: 'App',
  data() {
    return{
      selectId:'1001',

     }
  },
  components: {
    SelectComp,

  },
  methods: {},
}
</script>
<style lang="less" scoped></style>

这里::value='selectId' @input="selectId=$event"
换成了 v-model="selectId"

完整代码
<select-comp v-model="selectId"></select-comp>

子组件(SelectComp.vue)

<template>

  <select :value="value"  @change='changeOption'>
    <option value="1001">北京</option>
    <option value="1002">上海</option>
    <option value="1003">广州</option>
    <option value="1004">深圳</option>
  </select>
</template>

<script>
export default {
  data() {
    return {};
  },
  props: {
    value:{
        type: String,
        required: true
    }
   
  },
   methods: {
        changeOption(e){
            this.$emit('input',e.target.value)
        }
    }
};
</script>
<style>
</style>

这里:传递参数固定为value$emit()中的事件名成固定为input

<select :value="value" @change="handleChange">...</select>
props: {
  value: String
},
methods: {
  handleChange (e) {
    this.$emit('input', e.target.value)
  }
}

v-model简化写法缺点: value属性 语义化不友好

二、 .sync修饰符

.sync修饰符作用:

可以实现 子组件父组件数据双向绑定,简化代码

简单理解:子组件可以修改父组件传过来的props值

当我们从父组件向子组件传入一个变量,子组件需要根据自身的变化引起变量值的改变时
可应用至弹框的开启、关闭

语法

父组件


    <SelectComp :selectId.sync='selectId'/>
    <!-- 等价于 -->
    <SelectComp :selectId='selectId' @update:selectId='selectId = $event '/> 

子组件

props: {
  visible: Boolean
},

this.$emit('update:visible', false)

示例
父组件(App.vue)

<template>
  <div class="wrapper">
    <SelectComp :selectId.sync='selectId'/>
  </div>
</template>

<script>
import SelectComp from './components/SelectComp.vue'
export default {
  name: 'App',
  data() {
    return{
      selectId:'1001'
     }
  },
  components: {
    SelectComp
  },
  methods: {},
}
</script>

SelectComp.vue

<template>

  <select :value="selectId"  @change='changeOption'>
    <option value="1001">北京</option>
    <option value="1002">上海</option>
    <option value="1003">广州</option>
    <option value="1004">深圳</option>
  </select>
</template>

<script>
export default {
  data() {
    return {};
  },
  props: {
    selectId:{
        type: String,
        required: true
    }
  },
   methods: {
        changeOption(e){
            this.$emit('update:selectId',e.target.value)
        }
    }
};
</script>

使用v-model实现了父子组件的双向绑定(父亲的数据传递给儿子,儿子可以修改父亲数据)

方法一:

  • 在父组件的子组件标签上使用v-model=‘父数据’

  • 儿子要通过value接收父亲数据,通过触发this.$emit(‘input’,参数)改变父亲的数据

方法二:

  • 在父组件的子组件标签上使用:自定义属性(语义).sync=“父数据”

  • 儿子要通过绑定自定义属性接收父亲数据,通过触发this.$emit(‘updata:自定义属性名’,参数)概念父亲的数据

方法二与方法一区别在于属性语义化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue 父子组件通信v-model .sync修饰符 的相关文章

  • FullCalendar-vue + Typescript:属性“getApi”不存在

    我尝试将 FullCalendar vue 与 Typescript 结合使用 但在访问其 API 时遇到错误 我的日历设置如下
  • JavaScript 添加布尔值

    console log true true 2 console log typeof true true number console log isNaN true true false 为什么两个布尔类型相加会产生一个数字 我有点理解 如
  • 显示具有多个父代的 D3 树

    我目前有this http bl ocks org mbostock 4339083图已实现 我希望在描述具有多个父节点的子节点时保持结构和可折叠性 有没有办法做到这一点 我研究了力图 但我也想保留一组层次结构 这意味着 1 级的父级可以有
  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • 从函数返回函数的目的是什么?

    阅读一些遗留代码 发现 A prototype setSize function var v1 new Vector2 return function size var halfSize v1 copy size multiplyScala
  • 位置特征检测:固定

    我正在尝试找到一个脚本来检测设备是否放置position fixed元素相对于视口而不是整个文档 目前 标准桌面浏览器和 Mobile Safari 适用于 iOS 5 都是这样做的 而 Android 设备则相对于整个文档放置固定元素 我
  • Angular.js:如何从无序列表中获取 orderBy 或过滤器来工作?

    尝试根据价格和评级 在返回的对象中 进行排序 我宁愿用 ng click 和 li 来代替使用选择菜单 有没有办法做到这一点 我环顾四周 这是我能想到的最接近的 ul class restaurant filter li i class i
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 如何在网站上使用 svg 元素制作块的屏幕截图?

    我在网站上创建了一个构造函数 其本质是将所选元素及其颜色 svg中的元素 添加到访问者选择的背景和背景颜色 png中的背景 中 然后必须单击 保存 结果 按钮并仅执行工作区的屏幕截图 我写了这个脚本 但它需要屏幕截图 但只有背景 并忽略选定
  • IntersectionObserver是否支持水平滚动观察?

    我制作了几个垂直滚动 IntersectionObserver 模块 但我对水平滚动感兴趣 根将是 div 观察目标将是 img 我想观察当 img 放大但 div 保持视口宽度时的变化 我什至不确定移动 Safari 是否会将缩放后的图片
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • 如何使用角度材料在具有可扩展行的表格中创建嵌套垫表

    我有以下数据 id c9d5ab1a subdomain wing domain aircraft part id c9d5ab1a info mimetype application json info dependent parent
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 使用 Enzyme 测试 `React.createRef` api

    我想测试下面的类 它使用React createRef api 不过 快速搜索并没有发现任何这样做的例子 有人成功过吗 我该如何嘲笑裁判 理想情况下我想使用shallow class Main extends React Component
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供

随机推荐

  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 微信小程序开发-AppID申请

    开始 开发小程序的第一步 你需要拥有一个小程序帐号 通过这个帐号你就可以管理你的小程序 跟随这个教程 开始你的小程序之旅吧 申请帐号 进入小程序注册页 根据指引填写信息和提交相应的资料 就可以拥有自己的小程序帐号 在这个小程序管理平台 你可
  • TortoiseSVN 日常操作指南

    原文地址 http blog csdn net happy4nothing article details 376604 Toc101751879 TortoiseSVN A Subversion client for Windows St
  • Oracle中如何获取系统当前时间

    select to char sysdate yyyy mm dd hh24 mi ss from dual ORACLE里获取一个时间的年 季 月 周 日的函数 select to char sysdate yyyy from dual
  • 解决Visual Studio Code点击运行出现无法访问此网站

    1 访问后的网页 2 经过检查发现里面多出一个文件 vscode gt launch json 可能是你在运行时打开的窗口有 css文件 这是我猜的 3 把多出的文件夹删除掉 Vscode launch json 把刚才拒绝访问的网页关闭掉
  • 6、USRP【入门软件无线电(SDR)】PySDR:使用 Python 的 SDR 和 DSP 指南

    因为设备不同 本教程未实测 仅作为USRP参考 在本章中 我们将学习如何使用UHD Python API通过USRP控制和接收 传输信号 USRP是由Ettus Research 现为NI的一部分 制造的一系列SDR 我们将讨论 Pytho
  • Gbps/KW

    Gbps 衡量交换机的数据交换能力 传输速度为每秒1000兆位 即1Gbps
  • node封装传formdata数据的接口(多文件上传)

    前文 这个星期的主要完成的东西我想就是多文件上传了 这也是我第一次封装传formdata数据类型的数据 因为也是刚学不久node 很多东西都是要自己摸索的 关于这个多文件上传我也是查阅了不少的博客 也是问了学长 最后问题才得以解决 关于接口
  • 企业性能测试成熟度

    影响性能测试成熟度的5个内容项 1 性能测试流程规范 性能需求型模式 测试执行启动基本无规划 缺少标准流程规范 测试资产无法复用 测试结果无总结和沉淀性能常态化模式下流程规范 gt 企业内部不同部门 各个团队共同制定并执行达成一致的性能测试
  • 两数之和 暴力美学 哈希表

    1 两数之和 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 的那 两个 整数 并返回它们的数组下标 leetcode 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出
  • 常见模拟电路设计 一(含仿真):方波、三角波、正弦波的互相发生

    FPGA最近有些整累了 给大家开个模拟电路设计的坑 内含干货 请放心食用 一 总体设计方案 二 单元电路设计和原理说明 2 1方波发生电路 波形发生电路可以由集成运放芯片构成运算电路来实现 第一步的方波发生电路 可以由滞回比较器和RC电路构
  • midjourney上线slack,国内也能用上啦!mjslackbot

    Mjslackbot 国内免费免魔法的原版midjourney 跟discord上的操作一模一样 在频道中描述你的关键词 既可生成精美的图案 手把手教学 1 注册Slack https slack com intl zh cn 注册成功后会
  • 解决word页码混乱并使页码从指定页开始

    解决word页码混乱并使页码从指定页开始 1 解决word页码混乱 页码混乱是由于误加了分节符导致的结果 导致页码不按照物理顺序排序 因此 我们在大纲模式下删除所有分节符 重排页码 2 从指定页重排页码 在指定页页眉位置点击布局 选择分隔符
  • Kafka3.0.0版本——消费者(消费者组案例)

    目录 一 消费者组案例 1 1 案例需求 1 2 案例代码 1 2 1 消费者1代码 1 2 2 消费者2代码 1 2 3 消费者3代码 1 2 4 生产者代码 1 3 测试 一 消费者组案例 1 1 案例需求 测试同一个主题的分区数据 只
  • cmake(三十二)Cmake之find_package指令

    一 cmake帮助文档 find package命令详解 1 help command list cmake 内置命令 列表 2 help comamnd
  • 使用LogHub进行日志实时采集

    日志服务LogHub功能提供日志数据实时采集与消费 其中实时采集功能支持30 种手段 这里简单介绍下各场景的接入方式 数据采集一般有两种方式 区别如下 我们这里主要讨论通过LogHub流式导入 实时 采集 方式 优势 劣势 例子 批量导入
  • QSS-Qt样式表一

    QSS即Qt StyleSheet Qt样式表 的简称 是一种用来自定义控件外观的强大机制 QSS可以让我们的程序界面更加漂亮 每条QSS样式都由两部分组成 1 选择器 该部分指定要美化的控件 2 声明 该部分指定要在控件上使用的属性 声明
  • 一直在说高并发,多少QPS才算高并发?

    高并发的四个角度 只说并发不提高可用就是耍流氓 可以从四个角度讨论这个问题 首先是无状态前端机器不足以承载请求流量 需要进行水平扩展 一般QPS是千级 然后是关系型数据库无法承载读取或写入峰值 需要数据库横向扩展或引入nosql 一般是千到
  • XShell连接ubuntu20.04.LTS

    1 下载Xshell XShell官方下载地址 打开XSHELL官方下载地址 我们可以选择 家庭和学校用户的免费许可证 输入邮箱之后即可获得下载链接 安装非常简单 跟着提示进行即可 2 连接ubuntu 2 1 查看ubuntu的ip地址
  • Vue 父子组件通信v-model .sync修饰符

    一 v model简化父子组件通信 v model是什么 v model 是Vue框架的一种内置的API指令 本质是一种语法糖写法 它负责监听用户的输入事件以更新数据 并对一些极端场景进行一些特殊处理 v model实现表单的双向绑定