Vue3.3新特性defineModel

embedded/2024/9/23 3:47:01/

defineModel的使用:

defineModel选项可以帮我们省去很多麻烦

不仅需要上述操作,还需要进行一定的配置:

在vite.config.js中进行配置


defineModel是一个宏,所以不需要从vue中import导入,直接使用就可以了。这个宏可以用来声明一个双向绑定 prop,通过父组件的 v-model 来使用。

父组件:

javascript"><template><CommonInput v-model="inputValue" />
</template><script setup lang="ts">
import { ref } from "vue";const inputValue = ref();
</script>

子组件:

javascript"><template><input v-model="model" />
</template><script setup lang="ts">
const model = defineModel();
model.value = "xxx";
</script>

在上面的例子中我们直接将defineModel的返回值使用v-model绑定到input输入框上面,无需定义 modelValue 属性和监听 update:modelValue 事件,代码更加简洁。defineModel的返回值是一个ref,我们可以在子组件中修改model变量的值,并且父组件中的inputValue变量的值也会同步更新,这样就可以实现双向绑定。

同一个变量不要进行多个双向绑定:

 使用arco组件的时候,自己封装的组件遇到的一个问题:

javascript"><a-tab-pane key="1" :title="`全部${total_1} `"><comment-tableref="comTable1"v-model:delete="deleteDialog1"v-model:audit="auditDialog1"v-model:total="total_1"v-model:search="searchTerm"itemType="1"@update:enabled="updateButtonState"></comment-table></a-tab-pane><a-tab-pane key="2" :title="`待审${total_2}`"><comment-tableref="comTable2"v-model:delete="deleteDialog2"v-model:audit="auditDialog2"v-model:search="searchTerm"v-model:total="total_2"itemType="2"@update:enabled="updateButtonState"></comment-table></a-tab-pane><a-tab-pane key="3" :title="`已批准${total_3}`"><comment-tableref="comTable3"v-model:delete="deleteDialog3"v-model:audit="auditDialog3"v-model:search="searchTerm"v-model:total="total_3"itemType="3"@update:enabled="updateButtonState"></comment-table></a-tab-pane>

 最开始的时候v-model三个自己封装的组件comment-table绑定的都是同一个属性,比如:

javascript">          v-model:delete="deleteDialog"v-model:audit="auditDialog"v-model:search="searchTerm"

复用三个就会出现问题,导致我对第二个子项操作的时候,莫名奇妙itemType就会从2变成3
最后修改成三个区分的变量就没问题了

原因:

v-model 是用于双向绑定的指令,通常用于将父组件的状态与子组件的内部状态进行同步。每个 v-model 都会绑定到一个特定的属性。这意味着在同一时间内,你不能将多个 v-model 指令绑定到同一个变量,因为这会导致数据冲突和不确定的行为。

  1. 数据冲突:

    • 如果多个 v-model 绑定到同一个变量,更新其中一个会导致其他绑定的变量也发生变化,从而产生不一致的状态。
  2. 双向绑定的复杂性:

    • 双向绑定的设计是为了让数据在父子组件之间保持同步。如果多个组件同时尝试更新同一个数据源,可能会导致难以预料的结果。
  3. 组件实例化:

    • 每个 comment-table 实例可能会有不同的状态和逻辑,试图将它们绑定到同一个变量会使得状态管理变得复杂和混乱。

http://www.ppmy.cn/embedded/115396.html

相关文章

Flask 设置session 自定义登录验证

"""1. 设置session# 设置session成功 重定向到首页session.permanent True # 设置会话过期时间session[info] usernamereturn redirect(url_for(index))2. 获取sessioninfo session.get(info, default0)return render_template(index.html, infoinfo)3. 设置…

小程序与APP的区别

目录 前言1. 开发方式与成本2. 运行环境与获取途径3. 功能复杂度与交互体验4. 更新与维护5. 推广与用户获取6. 占用空间与存储7. 可分享性总结 前言 小程序与APP作为两种不同类型的应用程序&#xff0c;它们在多个方面存在明显的区别。以下是对这些区别的详细阐述&#xff1a;…

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标

chrome 谷歌浏览器&#xff0c;鼠标点击任何区域都是 Input 输入框的状态&#xff0c;能看到输入的光标 今天打开电脑的时候&#xff0c;网页中任何文本的地方&#xff0c;只要鼠标点击&#xff0c;就会出现一个输入的光标&#xff0c;无论在哪个站点哪个页面都是如此。 我知道…

大尺寸卷积核的优缺点

大尺寸卷积核在卷积神经网络中具有一些独特的优缺点&#xff0c;具体如下&#xff1a; 优点&#xff1a; 更大的感受野&#xff1a; 大尺寸卷积核能够捕获更大的上下文信息&#xff0c;拥有更广的感受野。它可以一次性处理更大区域的特征信息&#xff0c;尤其在处理复杂的视觉…

P1706 全排列问题(dfs+递归)

1. x表示层数&#xff0c;第一层选了1执行for1&#xff0c;进入第二层选2并标记2&#xff0c;第二层只进行到for2&#xff0c;进入第三层选3并标记3&#xff0c;选完之后删除标记3。到现在完成第一组123 2.之后回到第二层释放2再进行for3,第二层选择3&#xff0c;第三层执行到…

Android中的Context

Android中的Context是一个核心概念&#xff0c;它代表了应用程序的运行环境和上下文信息。Context在Android开发中扮演着至关重要的角色&#xff0c;为应用程序提供了访问系统资源、启动组件、发送广播、获取系统服务等能力。下面&#xff0c;我将从Context的定义、种类、作用、…

【Delphi】知道控件名称(字符串),访问控件

在 Delphi 中&#xff0c;可以使用 RTTI&#xff08;运行时类型信息&#xff09; 或其他方法通过对象的名称字符串来访问对象。比如&#xff0c;如果你有一个控件的名称字符串&#xff0c;你希望通过该名称找到并访问实际的控件。 以下是通过 RTTI 以及其他技术&#xff08;如…

分布式安装LNMP

目录 搭建LNMP架构 安装mysql 1.上传mysql软件包&#xff0c;关闭防火墙和核心防护 2.安装环境依赖包&#xff0c;桌面安装可能有自带的数据库除 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目录和配置文件的属主属组 8.设置…