观前须知:本人演示使用的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.x如何给v-for循环出来的输入框绑定v-mode的值,以及实现父子组件传值、双向绑定的更多相关文章

  1. CF E. Vasya and a Tree】 dfs+树状数组(给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值)

    题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...

  2. vue+node.js+webpack开发微信公众号功能填坑——v -for循环

    页面整体框架实现,实现小功能,循环出数据,整体代码是上一篇 vue+node.js+webpack开发微信公众号功能填坑--组件按需引入 修改部门代码 app.vue <yd-flexbox&g ...

  3. 利用闭包解决for循环里onclick事件不能捕捉实时i值问题

    问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...

  4. 用jquery循环获得所有input标签里的value值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. js循环里进行回调,引用循环里的变量,发现只是最后值的问题

    做项目的时候,栽在一个小地方,是这样的 我有很多个坐标点,我想把这些坐标点都绑定一个事件,当点击了这个坐标点之后,发送一个ajax 请求,将坐标点的id 发出去,等待显示返回的数据 但是实际当中,无论 ...

  6. 39.VUE学习--组件,子组件中data数据的使用,x-template模板的使用,改变for循环里的某条数据里的值

    多处引用相同组件时,操作data不会相互影响 <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  7. Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)

    首先 我们先看到的这个方法入参是:Function<? super Object , V> mapper ,这是jdk1.8为了统一简化书写格式引进的函数式接口 . 简单 解释一下我对Fu ...

  8. Python3基础 dict keys+values 循环打印字典中的所有键和值

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. 多层v-for循环嵌套导致v-model双向绑定失败,页面不重新渲染

    数据格式是数组包对象,对象里面再包数组,数组再包对象,如下: 外层for遍历出editInfo里面所有的属性,内层for遍历Options. 最终实现样子 两个问题: 1.点加减按钮的时候往optio ...

随机推荐

  1. Linux—文件系统结构

    1.文件目录结构 /:是Linux系统的根目录 /bin:存放用户经常使用的命令 /boot:启动加载程序的静态文件 /dev:设备文件目录,不能单独分区 /etc:系统配置文件目录 /home:普通 ...

  2. eclipse mave无法下载jar包

    解决方法: 先查看本地配置是否正确: 确保此处没有勾选 此处和自己配置的maven一致,没有则修改此处设置.然后项目上右键–>Maven–>Update Project 即可 . 如果还不 ...

  3. 年度开源盛会 ApacheCon 首发中文盛宴来临,欢迎报名!

    ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯 1998 年,也是在这一届上,开发 HTTPD 服务的开发者们欢聚一堂,并决定 ...

  4. Taurus.MVC 微服务框架 入门开发教程:项目集成:5、统一的日志管理。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  5. Vue3中插槽(slot)用法汇总

    Vue中的插槽相信使用过Vue的小伙伴或多或少的都用过,但是你是否了解它全部用法呢?本篇文章就为大家带来Vue3中插槽的全部用法来帮助大家查漏补缺. 什么是插槽 简单来说就是子组件中的提供给父组件使用 ...

  6. Java项目生成电脑桌面快捷脚本

    一.场景说明 经常需要查询以及设置手机验证码,一般验证码都是放在Redis,为了节省短信费,可以直接设置Redis,本篇内容主要介绍如何便捷查询和设置手机验证码,非开发人员也会操作. 二.Java代码 ...

  7. 给网站添加pjax无刷新,换页音乐不中断

    自从博客加了悬浮音乐播放器后就一直在折腾换页音乐不中断的功能 在网上查找后发现想要实现换页音乐不中断的功能必须要为博客加pjax,于是又苦苦寻找并尝试了一番 最后发现网上实现pjax功能基本上是两种方 ...

  8. 【NOI P模拟赛】最短路(树形DP,树的直径)

    题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...

  9. ARC116 A Odd vs Even (质因数分解,结论)

    题面 有 T T T 组数据,每次给出一个数 N N N ,问 N N N 的所有因数(包括 1 1 1 和 N N N)中奇因数个数和偶因数个数的关系(">"," ...

  10. 试用 ModVB(一):安装教程+使用 JSON 常量和 JSON 模式匹配

    前排提醒:阅读此文章并充分尝试 ModVB 的新语法需要较长的时间.对于程序员而言,如果你工作时不用 VB,则最好避免在上班时间看,以免被领导认为你在长时间摸鱼. 什么是 ModVB ModVB 是一 ...