首页 > 其他分享 >v-model 原理、v-model 应用于组件 实现组件通信

v-model 原理、v-model 应用于组件 实现组件通信

时间:2023-10-09 20:36:58浏览次数:32  
标签:target 通信 value 组件 input model 下拉菜单

原理:v-model 本质上是一个语法糖。例如应用在输入框上,就是 value 属性 和 input 事件 的合写(如果应用于复选框,就是 checked 属性和 change 事件的合写,下拉菜单是 value 属性和 change 事件的合写)

作用:提供数据的双向绑定

          ①数据变,视图跟着变   :value

          ②视图变,数据跟着变   @input

 

<input  v-model = "msg"  type = "text">     等价于→     <input  :value = "msg"  @input = "msg = $event.target.value"  type = "text">

$event 用于在模板中,获取事件的形参。  $event.target.value 就是输入框内输入的内容

------------------------------------------------------------------------------------------------------------------------------------------

 

表单类组件的封装(本质是实现了 子组件 和 父组件数据 的双向绑定):

① 父传子:数据 应该是父组件 props 传递过来的,v-model 拆解 绑定数据(v-model 不能直接与父组件的数据绑定,因为 v-model 是双向绑定,意味着是会改值的,而子组件不能直接修改父组件的数据,所以要将 v-model 进行拆解)

② 子传父:监听输入,子传父传值给父组件修改

 

eg:App.vue中导入下拉菜单组件

第一步——父传子:

1. 父组件App.vue:

data 函数中定义变量:selectId : "103" 

// 把城市 id 传给子组件

<BaseSelect   :cityId = "selectId"> </BaseSelect>

 

2. 子组件 BaseSelect.vue中进行接收:

<template>

     <div>

           <select   :value = "cityId">

                <option  value = "101"> 北京 </option>

                <option  value = "102"> 上海 </option>

                <option  value = "103"> 河北 </option>

           </select>

     </div>

</template>

<script>

export  default  {

      props : {

            cityId : String

      }

}

</script>

 

第二步——子传父:

1. 监听子组件中 下拉菜单的修改:

<template>

     <div>

           <select   :value = "cityId"   @change = "handleChange">

                <option  value = "101"> 北京 </option>

                <option  value = "102"> 上海 </option>

                <option  value = "103"> 河北 </option>

           </select>

     </div>

</template>

<script>

export  default  {

      props : {

            cityId : String

      },

      methods : {

            handleChange ( e ) {

                  // e.target:触发事件的事件源——下拉菜单     e.target.value:值

                  this.$emit (' changeId ' ,  e.target.value)

            }

      }

}

</script>

 

2. 父组件监听修改:

<BaseSelect   :cityId = "selectId"   @changeId = "selectId = $event"> </BaseSelect>      // $event:selectId 事件的形参,也就是子组件的 e.target.value

 

------------------------------------------------------------------------------------------------------------------------------------------

 

父组件当中使用 v-model 应用于组件 来简化 组件封装的代码:

1. 子组件中:接收数据的时候,通过 value 属性来进行接收,触发事件时  事件名固定必须是 input

2. 父组件中:直接用 v-model 给组件绑数据

 

eg:

子组件改写:

1. <select   :value = "value"   @change = "handleChange">

2. props : {

            value : String

      },

methods : {

            handleChange ( e ) {

                  this.$emit (' input ' ,  e.target.value)

            }

      }

 

父组件改写:

<BaseSelect   :value = "selectId"   @input = "selectId = $event"> </BaseSelect>

因为 v-model 本质是  :value 与 @input 的组合,所以直接改写  →  <BaseSelect   v-model = "selectId"> </BaseSelect>

 

标签:target,通信,value,组件,input,model,下拉菜单
From: https://www.cnblogs.com/gagaya2/p/17753060.html

相关文章

  • 论文阅读(一)—— Adding Conditional Control to Text-to-Image Diffusion Models
    ......
  • 【Mybatis】model类通过注解忽略某属性
    当使用的model类中需要新增一些字段仅用于程序中传参,而不需要添加到数据库表中时,可以通过添加@Transient注解使mybatis忽略它而不做对应关系。例如:@TransientprivateStringuserConfig;如果是使用的mybatisplus,需要使用@TableField(exist=false)注解,表示表中不存在......
  • 使用 Webpack 的 require.context 来获取组件
    代码constrequireComponent=require.context('@/views',//组件文件夹的相对路径true,//是否查找子文件夹/\.vue$///匹配组件文件的正则表达式)输出console.log(requireComponent.keys())原理require.context在生产环境中也能获......
  • 关键组件
    Tamagui提供各种本机和Web组件,例如按钮、开关、堆栈、输入、工作表等。然而,它提供的不仅仅是一个漂亮的组件库,它还有自己的编译器,可以扁平化您的组件树并修改您的样式以最适合您的应用程序运行的任何平台。可以在Expo和Next.js应用程序中使用,允许您在本机应用程序和Web......
  • 组件通信方案
    组件通信是指组件与组件之间的数据传递。组件的数据是独立的,无法直接访问其他组件的数据,想用其他组件的数据,需要通过组件通信方案。 组件关系分类:父子关系、非父子关系 组件通信方案:父子关系:props(父传子)和$emit(子传父)非父子关系:①provide&inject     ......
  • 风控指南 | 风控引擎如何快速管理组件?
    风控组件是指在风险控制系统中用于监测、识别和处理各类风险行为的模块或工具。它们通过使用不同的算法、规则和技术,协助机构或企业实施有效的风险管理和防范措施。风控组件通过数据分析、模型建立、规则引擎等技术手段,帮助机构或企业及时识别和预警各类风险行为,并采取相应的措施......
  • HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack
    堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。该组件从APIVersion7开始支持。可以包含子组件。一、接口Stack(value?:{alignContent?:Alignment})从APIversion9开始,该接口支持在ArkTS卡片中使用。二、属性除支持通用属性外,还支持以下属性:三、示例//xxx.e......
  • 全局组件的注册和使用
    全局注册:所有组件内都能直接使用。在多个组件范围内使用的通用的组件就可以定义成全局组件 步骤:①创建.vue文件(三个组成部分)      ②main.js中进行全局注册            //(import 组件对象 from '.vue文件路径')    ......
  • linux 内核五大模块:网络通信
    网络通信网络通信是一种把不同计算机或网络设备连接到一起的技术,本质上是跨系统的进程间通信,必须要通过网络(硬件)才能进行。随着高并发、分布式、云计算、微服务等技术的普及,网络的性能也变得越来越重要。一、网络模型1.1OSI模型为了解决网络互联中异构设备的兼容性问题,并解......
  • Linux中使用虚拟路由器进行不同命名空间之间的通信测试
    一个学习研究的案例ipnetnsaddns1#创建命名空间ns1ipnetnsaddns2#创建命名空间ns2创建虚拟路由器设备ipnetnsaddrouter#创建虚拟路由器命名空间iplinkaddveth1typevethpeernameveth1-router......