首页 > 其他分享 >Vu3.x如何给v-for循环出来的输入框绑定v-mode的值,以及实现父子组件传值、双向绑定

Vu3.x如何给v-for循环出来的输入框绑定v-mode的值,以及实现父子组件传值、双向绑定

时间:2022-10-10 23:13:21浏览次数:54  
标签:绑定 传递 输入框 Vu3 双向 组件 textVal defineProps

观前须知:本人演示使用的input是自己手敲的,如果使用的是element-ui等表单组建的input框请选择性参考,不保证我的方法对你们也完全有效。

父组件代码:

这里我的MiniInput是以组件形式引入的父页面 (这里只贴关键代码)

<template>
	<div>
    <MiniInput
 			v-for="item in titleArray"
  		:key="item.id"
 			>
       <template #miniTitle> {{ item.name }} </template>
		</MiniInput>
  </div>
</template>
<script setup lang="ts">
  import { Ref, ref } from 'vue'
  import MiniInput from '../components/MiniInput.vue'
  //用ref包裹数组,方便后期实现双向绑定
  const titleArray: Ref<Array<TitleArray>> = ref([
    {
      name: 'Exclude content',
      id: 1231,
      textVal: ''
    },
    {
      name: 'Federated content',
      id: 1232,
      textVal: ''
    },
    {
      name: 'Optional retrieval',
      id: 1233,
      textVal: ''
    },
    ])
</script>

子组件代码:

<template>
  <div class="from__input__mini">
    <span class="mini-title">
      <slot name="miniTitle"></slot>
    </span>
    <input class="mini-input" type="text" />
  </div>
</template>
<script setup lang="ts">
</script>

上述代码可以得到以下界面效果,这是我们只完成了表面工作(请忽略样式)

下面开始正题:

首先,我们要打通父子组件的隔阂,先将父组件的textVal传递给子组件,这里我们需要使用到v-mode语法,将我们先前定义好的数组内的textVal属性传递过去。

<!-- 下面新增了一行 v-mode -->
<MiniInput
    v-model:textVal="item.textVal"
 		v-for="item in titleArray"
  	:key="item.id"
 >
       <template #miniTitle> {{ item.name }} </template>
	</MiniInput>

随后我们来到子组件,为接收父组件传递过来的值做准备

<script setup lang="ts">
  // defineProps 用于接收父组件传递过来的参数
  defineProps<{
    textVal: string
  }>()
</script>

此时我们就可以给子组件绑定父组件传递过来的参数了

<template>
  <div class="from__input__mini">
    <span class="mini-title">
      <slot name="miniTitle"></slot>
    </span>
    <input :value="textVal" class="mini-input" type="text" />
  </div>
</template>
<script setup lang="ts">
  // defineProps 用于接收父组件传递过来的参数
  defineProps<{
    textVal: string
  }>()
</script>

实现双向绑定

但是此时我们会发现,到目前为止我们也仅仅只是接受了父组件传递过来的参数,此时我们去输入框改变内容时,并不会同时改变父组件中的值,那么此时我们就要想办法实现数据流的 双向绑定

要实现双向数据响应,首先子组件要使用 defineEmits 接受父组件传递过来的 textValupdate 函数,随后我们给输入框添加一个input事件,目的是监听输入内容随后改变父组件中的对应属性。

<template>
  <div class="from__input__mini">
    <span class="mini-title">
      <slot name="miniTitle"></slot>
    </span>
    <input :value="textVal" @input="changeText" class="mini-input" type="text" />
  </div>
</template>
<script setup lang="ts">
  // defineProps 用于接收父组件传递过来的参数
  defineProps<{
    textVal: string
  }>()
  // 要实现双向数据响应要使用 defineEmits 接受父组件传递过来的 textVal 的 update函数
  const emit = defineEmits(['update:textVal'])
  // 输入框input事件
  const changeText = (e: Event) => {
    // 这里因为ts自动类型推断会把变量推断为EventTarget,导致没办法读取到.value属性,所以要进行一个类型断言
    const target = e.target as HTMLInputElement
    emit('update:textVal', target.value)
  }
</script>

这时我们就可以回到父组件中,为父组件的数组添加一个监听事件:

// 这里是父组件的script
<script setup lang="ts">
  import { Ref, ref, watch } from 'vue'
  ...
  ...
  ...
  // 监听数组
  watch
    titleArray,
    () => {
      console.log('数组变化了')
    },
    {
      deep: true
    }
  )
</script>

随后进行测试

可以看到,虽然是通过循环生成的三个子组件(input),但是它们各自都实现了双向数据绑定以及数据监听,至此,效果实现,本博客仅用于开发过程中的记录以及复盘,仅供参考!

标签:绑定,传递,输入框,Vu3,双向,组件,textVal,defineProps
From: https://www.cnblogs.com/mosaicMask/p/16777767.html

相关文章

  • linux网卡绑定bond
     1.什么是bond网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡。在应用部署中是一种常用的技术。2.bond的模式种类常见的bond......
  • #yyds干货盘点# 前端歌谣的刷题之路-第一百零九题-双向数据绑定
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • vue-4 CSS绑定/Style绑定
    <template><div><divclass="border-style"><h1:class="class3">-----------------CSS绑定-------------------</h1><div:class="{'c1':clEnable......
  • 参数绑定
    Controller层/***参数绑定*基本类型*String/包装类型默认为null*数组*集合-list/map*/@ControllerpublicclassParamsController......
  • this硬绑定
    一、this显示绑定this显示绑定,顾名思义,它有别于this的隐式绑定,而隐式绑定必须要求一个对象内部包含一个指向某个函数的属性(或者某个对象或者上下文包含一个函数调用位置),并......
  • Vue3 项目在 H5 + ios 环境中,input 输入框在输入中文未选中汉字时会触发 chang 事件,导
    省流版:看解决3环境vue3+vant+H5需求input输入框为验证码(隐含需求:用户接收到验证码时,需要复制验证码后可以点击输入法的联想词直接输入验证码,且需要仅能输入英文......
  • vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set
    响应式是什么?Vue最独特的特性之一~就是我们在页面开发时,修改data值的时候,数据、视图页面需要变化的地方变化。主要使用到哪些方法?用 Object.defineProperty给watcher对......
  • 类与样式绑定
    类与样式绑定先在css里面写好style,然后往代码里绑定就行如果想要控制css的显隐,要在data里面设置一个布朗类型的变量,用v-if或v-show控制,两个标签使用同一个data变量就可......
  • Vue阻止点击其他DOM节点失去输入框焦点
    <[email protected]="comfirm"><u-buttonsize="medium"type="primary">确定</u-button></view>mousedown事件使用capture修饰符配合prevent......
  • v-model数据绑定底层原理
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"conten......