Vue中子组件通过v-model动态修改父组件中的值

2023-11-13

父子通信中的子传父-使用v-model实现双向数据绑定

注意:vue组件是此组件的根组件,是该组件中所有注册的组件的父组件

  • 现有需求:通过子组件中的输入框来动态绑定父组件中data中的数据。

  • 代码实现

  1. 父组件使用porps来向子组件传值
  2. 子组件通过自己定义的两个属性(number1,number2)来接受父组件的值(num1,num2)
  3. 通过v-model属性将输入框与子组件的number1和number2来进行绑定
  • 结果

    • 上面功能的实现的确没有问题,但思路有问题,而且在一般情况下,vue是不建议通过这种方式来直接修改父组件中的值的。

    • 代码如下:

      <body>
        <div id="app">
          <cpn :number1="num1" :number2="num2"></cpn>
        </div>
      
        <template id="cpm">
          <div>
            <h2>props:{{number1}}</h2>
            <h2>data:{{dnumber1}}</h2>
            <input type="text" v-model="number1">
           
            <h2>props:{{number2}}</h2>
            <h2>data:{{dnumber2}}</h2>
            <input type="text" v-model="number2">
      
          </div>
        </template>
      
        <script>
          const app = new Vue({
            el: '#app',
            data: {
              num1: 1,
              num2: 0
            },
            components: {
              cpn: {
                template: '#cpm',
                props: {
                  number1: Number,
                  number2: Number
                },
              },
            },
          })
        </script>
      </body>

分析:注册了一个cpn组件,使用父传子的方式传了两个值,一个是number1,一个是number2。cpn组件在声明的时候,使用v-bind单方向绑定了父组件data中的num1,和nmu2。在cpn组件内部,在表单中使用v-model动态绑定number1,和number2。这样就可实现在子组件中设置值,父组件中的data也可以跟着修改的需求。

  • 运行截图

Snipaste_2022-05-20_17-15-07

反思:这样虽然可以实现子组件向组件传值,但这种方法在vue看来是极为不推荐的。

  • 代码改进
    • 代码实现
      • 在上面的基础上,我在子组件中定义两个data属性(dnumber1,dnumber2),用来保存父组件传过来的值
      • 将input绑定的属性从number1改为dnumber1,number2同理
<body>
  <div id="app">
    <cpn :number1="num1" :number2="num2"></cpn>
  </div>

  <template id="cpm">
    <div>
      <!-- 用来查看父子组件中,值的变化情况 -->
      <h2>props:{{number1}}</h2>
      <h2>data:{{dnumber1}}</h2>
      <input type="text" v-model="dnumber1">
     
      <!-- 用来查看父子组件中,值的变化情况 -->
      <h2>props:{{number2}}</h2>
      <h2>data:{{dnumber2}}</h2>
      <input type="text" v-model="dnumber2">
      
    </div>
  </template>

  <script>
    const app = new Vue({
      el: '#app',
      data: {
        num1: 1,
        num2: 0
      },
      components: {
        cpn: {
          template: '#cpm',
          props: {
            number1: Number,
            number2: Number
          },
          data() {
            return {
              dnumber1: this.number1,
              dnumber2: this.number2
            }

          }
        },
      },
    })
  </script>
</body>
  • 运行截图

Snipaste_2022-05-20_17-28-25

反思:这样是不报错了,但是父组件中的值没有被修改呀,看来得使用自定义事件来向父组件传值了!

  • 代码改进

    • 自组件使用$emit自定义事件创建一个自定义事件dnumber1change,dnumber2change,并将dnumber1,和dnumber2传递过去。

      • 父组件定义监听函数number1chage,number2change,在这个函数中,将取得的值value传递给父组件data中的值,从而将num1,和num2的值进行修改。
<body>
  <div id="app">
    <cpn :number1="num1" :number2="num2" @dnumber1change="number1chage" @dnumber2change="number2change"></cpn>
  </div>

  <template id="cpm">
    <div>
      <!-- 用来查看父子组件中,值的变化情况 -->
      <h2>props:{{number1}}</h2>
      <h2>data:{{dnumber1}}</h2>
      <input type="text" :value="dnumber1" @input="num1Input">
      <!-- 用来查看父子组件中,值的变化情况 -->
      <h2>props:{{number2}}</h2>
      <h2>data:{{dnumber2}}</h2>
      <input type="text" :value="dnumber2" @input="num2Input">
    </div>
  </template>

  <script>
    const app = new Vue({
      el: '#app',
      data: {
        num1: 1,
        num2: 0
      },
      methods: {
        number1chage(value) {
          this.num1 = parseInt(value)
        },
        number2change(value) {
          this.num2 = parseInt(value)

        }
      },
      components: {
        cpn: {
          template: '#cpm',
          props: {
            number1: Number,
            number2: Number
          },
          data() {
            return {
              dnumber1: this.number1,
              dnumber2: this.number2
            }
          },
          methods: {
            num1Input(event) {
              this.dnumber1 = event.target.value;
              // 为了父组件可以修改值,发出一个事件
              this.$emit('dnumber1change', this.dnumber1);
            },
            num2Input(event) {
              this.dnumber2 = event.target.value;
              //  为了父组件可以修改值,发出一个事件
              this.$emit('dnumber2change', this.dnumber2);
            }
          }
        },
      }
    })
  </script>
</body>
      
  • 运行截图

    Snipaste_2022-05-20_18-02-13

总结:v-model的本质

  1. < input type=“text” v-model=“dnumber1”>
  2. < input type=“text” v-bind:value=“dnumber1” @input=“dnumber1=$event.target.value”>

下面的代码等同于上面的代码, 这也就是需求实现的关键

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

Vue中子组件通过v-model动态修改父组件中的值 的相关文章

随机推荐

  • 【问题解决】docker login报错 org.freedesktop.Secret.Error.IsLocked: Cannot create an item in a locked collec

    问题场景 环境 docker 24 0 2 社区版 Ubuntu Server 18 04LTS 刚刚执行 docker login 登录仓库报错 hellxz bigdata dockerTest docker login harbor
  • 成功GET一款高大上又不显俗的Linux时间锁屏软件-GLUQLO

    闲来无事 总觉得目前的Ubuntu桌面锁屏看烦了 依然记得之前手机端曾经流行过一款锁屏软件 想想这个应该会有Linux版了 度娘果然查到了 名字就叫GLUQLO 而且也有Linux版还是开源的 那就开始动起来 一 安装环境 机器环境 Lin
  • 程序员到了35岁就会失业吗?三位程序员UP主这样说……

    Q 你自己也是 up 然后会接触很多程序员群体 你觉得你在跟这些程序员沟通下来 他们会有一些关于年龄方面的焦虑嘛 A 很多人都有 而且很多人都是 还没入行就开始焦虑了 就开始问我 水哥水哥 咱这程序员是不是真的到了 35 岁 就 就完蛋了
  • 【Rust】003-基础语法:流程控制

    Rust 003 基础语法 流程控制 文章目录 Rust 003 基础语法 流程控制 一 概述 二 if 表达式 1 语法格式 2 多个 3 获取表达式的值 三 循环 1 loop 无限循环 可跳出 无限循环 跳出循环 返回值 2 whil
  • EL-FROM动态添加item并设置必填

  • 短视频批量剪辑--矩阵源码---无人直播如何搭建技术开发

    一 核心技术 1 AI自动直播 智能系统通过丰富可定制的文案库 拥有有料有趣的灵魂 不仅能自动语音讲解内容 还可以在直播中和用户灵活互动 直播中可将团购商品同话术自动上下架 2 AI剪辑 可一键智能批量成片 也可跟着模板剪同款视频 更可针对
  • 全速下载微云方法

    下载tim 测试版 版本TIM 2 5 8 apk https www lanzous com iaroy3i 登陆QQ小号 转储文件至微云 QQ小号登陆tim 文件 微云文件 找到文件 点进去 点右上角转发到qq大号上 全速下载
  • OpenGL编程指南-freeglut安装(Windows平台)

    OpenGL编程指南 freeglut安装 Windows平台 1 前言 学习OpenGL编程首先需要可以跟着书中的示例代码进行学习 书中使用GLUT作为示例代码的演示 GLUT于1998年作者不在维护并不开源 freeglut是一个完美的
  • Regex-后向引用

    使用小括号指定一个子表达式后 匹配这个子表达式的文本 也就是此分组捕获的内容 可以在表达式或其它程序中作进一步的处理 默认情况下 每个分组会自动拥有一个组号 规则是 从左向右 以分组的左括号为标志 第一个出现的分组的组号为1 第二个为2 以
  • 在同一个canvas中绘制多个不同形状,颜色的图形

    今日踩坑 在同一个canvas中绘制多个不同形状 颜色的图形时 后面的总是将前面的颜色覆盖 解决方法 beginPath 和 closePath 这两个函数可以起到类似 div 的作用 用它来把每个图形包围 就可以绘制不同颜色的图形了 例如
  • 已上架的App在AppStore上无法搜索到的问题

    前言 如果还没有苹果开发者账号 自行注册苹果开发者中心 opens new window 并缴费成为开发者 证书配置 证书教程 opens new window Win系统请使用 appuploader opens new window 进
  • Android Studio更新3.1版本之后编译出现Program type already present: android.support.design.widget.CoordinatorLa

    前言 今天上午打包项目的时候出现了编译异常 怎么会出现这个问题 昨天编译都OK 然后想了下之后原来今天上午刚更新了新版本studio3 12 这有点尴尬了 感觉每次studio更新版本 都会遇到坑 要么gradle出现问题 要么编译异常提示
  • linux中$?,$#等代表什么

    0 这个程式的执行名字 n 这个程式的第n个参数值 n 1 9 这个程式的所有参数 此选项参数可超过9个 这个程式的参数个数 这个程式的PID 脚本运行的当前进程ID号 执行上一个背景指令的PID 后台运行的最后一个进程的进程ID号 执行上
  • C++primer plus 第十一章编程练习

    银行账户类 头文件 ifndef HEAD H define HEAD H include
  • muduo的高性能异步日志

    1 一个日志库大体可分为前端 frontend 与后端 backend 前端是供应用程序使用的接口 API 并生成日志信息 后端则是负责将日志信息写到目的地 每个线程都有自己的前端 而整个程序共用一个后端 对于生产者 前端 而言 要尽量做到
  • sql-labs 41-65关

    Less 41 这关还是堆叠注入 而且还是数字型闭合 可以照搬39关代码 但是与39不同的是 这关没有报错的显示位 查数据 id 1 id 0 union select 1 select group concat username from
  • 计数排序--时间复杂度为线性的排序算法

    我们知道基于比较的排序算法的最好的情况的时间复杂度是O nlgn 然而存在一种神奇的排序算法 不是基于比较的 而是空间换时间 使得时间复杂度能够达到线性O n k 这种算法就是本文将要介绍的计数排序 一 适用情况 这个算法在n个输入元素中每
  • 卷积神经网络超详细介绍

    文章目录 1 卷积神经网络的概念 2 发展过程 3 如何利用CNN实现图像识别的任务 4 CNN的特征 5 CNN的求解 6 卷积神经网络注意事项 7 CNN发展综合介绍 8 LeNet 5结构分析 9 AlexNet 10 ZFNet 1
  • layui option 动态添加_layui select 动态加载案例

    用到知识点 表单监听 form on 局部表单渲染 form render 动态加载的select表单 必须有默认的option项 第一个option 要不然layui 不会渲染出 select 组件 代码如下 添加数据 返回列表 查找所有
  • Vue中子组件通过v-model动态修改父组件中的值

    父子通信中的子传父 使用v model实现双向数据绑定 注意 vue组件是此组件的根组件 是该组件中所有注册的组件的父组件 现有需求 通过子组件中的输入框来动态绑定父组件中data中的数据 代码实现 父组件使用porps来向子组件传值 子组