【Vue3基础】组合事件配合v-model、watch的使用

一、需求描述

在组合事件中,实现在子事件输入框中输入使父事件实时显示输入内容

二、代码参考

1、关注文件,在App中嵌套Main,在Main中嵌套searchDemo

2、Main.vue文件

<template>
   <h3>Main页面</h3>
   <p>搜索内容为:{{ search }}</p>
   <searchDemo @searchEvent="getSearch" />
</template>
<script>
import searchDemo from "./searchDemo.vue"
export default {
    data(){
        return{
            search:""
        }
    },
     components: { 
        searchDemo
    },
    methods:{
        getSearch(data){
            this.search=data;
    }
}
}
</script>

3、searchDemo.vue文件

<template>
   输入:<input type="text" v-model="search">
</template>
<script>
export default {
    data() {
        return{
            search:""
        }
    },
    watch:{
        search(newValue,oldValue){
            this.$emit("searchEvent",newValue)
        }
    }
}
</script>

4、App.vue文件

<template>
  <Main  />
</template>
<script>
import Main from "./components/Main.vue";
export default{
  components: { 
    Main
  }
}
</script>

5、浏览器运行效果

 6、期间遇到的问题

[plugin:vite:import-analysis] Failed to parse source for import analysis because the content contains invalid JS syntax. Install @vitejs/plugin-vue to handle .vue files.

 网友分享的解决方法(见教程链接2):

但是自己试过,刷新浏览器仍旧报错。仔细查看代码,发现原searchDemo.vue文件中代码自己多敲了个括号,如下图。将括号删除后能正常运行,所以存在不同的原因导致相同的报错结果这种现象,以后要更仔细些才好!

 三、教程链接

1、视频https://www.bilibili.com/video/BV1Rs4y127j8?p=28&vd_source=841fee104972680a6cac4dbdbf144b50

2、关于 解决方法https://blog.youkuaiyun.com/u011024243/article/details/126058721

### Vue 3 使用 `v-model` 绑定 Props 在 Vue 3 中,`v-model` 提供了一种简洁的方式来处理输入控件的数据双向绑定。当希望自定义组件支持 `v-model` 并将其与父级传递下来的属性(即 props)关联起来时,可以通过特定配置使其实现。 #### 自定义组件中的 `v-model` 为了创建能够响应并更新来自父组件数据的子组件,在声明组件选项对象时需指定 `model` 字段[^2]: ```javascript Vue.component(&#39;vm-test1&#39;, { template: &#39;#vm&#39;, props: [&#39;txt&#39;], // 接收外部传入的内容作为初始值 data() { return { testVal: &#39;&#39; // 内部状态变量用于同步显示 } }, model: { prop: &#39;txt&#39; // 定义要监听变化的目标prop名称 }, watch: { testVal(newValue) { this.$emit(&#39;input&#39;, newValue); // 当内部状态改变时通知外界 } } }) ``` 此代码片段展示了如何设置一个名为 `vm-test1` 的全局注册组件,它接收一个叫做 `txt` 的 prop 来初始化其自身的 `testVal` 数据项;每当用户修改 `<input>` 输入框内的内容时,会触发 watcher 函数并通过 `$emit()` 方法向外发送新的字符串值给父组件。 #### 处理多层嵌套场景下的 `v-model` 对于更复杂的结构比如对话框或其他容器型组件来说,则可能涉及到多个层次间的相互作用。此时可以利用计算属性配合事件发射器完成跨层级的状态共享[^3]: ```html <!-- 子组件 --> <template> <el-dialog :visible.sync="dialogVisible"></el-dialog> <!-- 注意这里使用的是 .sync修饰符 --> </template> <script setup lang="ts"> import { computed } from &#39;vue&#39;; const props = defineProps({ modelValue: Boolean, }); // 计算属性负责获取/设定当前可见性标志位 const dialogVisible = computed({ get(): boolean { return !!props.modelValue; }, set(value: boolean): void { emit(&#39;update:modelValue&#39;, value); } }); const emit = defineEmits([&#39;update:modelValue&#39;]); </script> ``` 上述例子中,通过组合使用 TypeScript 和 Composition API 风格编写了一个具备 `v-model` 支持的基础弹窗组件 (`Dialog`) 。该组件接受布尔类型的 `modelValue` 参数控制自身是否展示,并且允许调用方轻松地读取或更改这个逻辑开关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林月明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值