账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    使用自定义组件v-model,界面不更新数据
    98
    0
    父组件chat.vue<template> <div class="chat"> <h2>chat-data:{{Data.text}}</h2> <List v-model="Data" v-model:text="txt" @update:model-value="inputFunc($event)"/> <h2>chat-text:{{txt}}</h2> </div></template><script lang="ts">import { defineComponent, ref, reactive } from 'vue'import List from '../list/list.vue'export default defineComponent({ name: 'chat', components:{ List }, setup() { let txt=ref('') let Data=reactive<any>({ placeholder:'请输入', text:'' }) const inputFunc=(event:any)=>{ console.log('inputFunc:',event.text) Data.text = event.text console.log(Data.text) } return { txt, Data, inputFunc } }})</script><style scoped>.chat{ padding: 100px 0;}</style>子组件:list.vue<template> <div class="list" ref="formRef"> list-modelValue: <input type="text" :value="modelValue.text" :placeholder="modelValue.placeholder" @input="modelValueChange($event)"> list-text: <input type="text" :value="text" @input="modelValueChange1($event)"> </div></template><script lang="ts">import { defineComponent } from 'vue'export default defineComponent({ name: 'list', props:{ // 组件的双向绑定的话,v-model冒号后面不写值,默认就是modelValue 进行接收 modelValue: { type: Object, required: true }, text:String, }, emits: ['update:modelValue','update:text'], setup(props, { emit }) { const modelValueChange = (event: any) => { console.log('handleValueChange') console.log(event.target.value) let val = event.target.value // 执行这个方法之后,就会传输到父组件,实现双向数据绑定 emit('update:modelValue',{ ...props.modelValue, text:val }) } const modelValueChange1 = (event: any) => { console.log('handleValueChange') emit('update:text',event.target.value) } return { modelValueChange, modelValueChange1 } }})</script><style scoped></style>为什么我在父组件可以监听到 Data.text 的更改,但是界面上只更改一次?但是用ref绑定的数据就没有问题
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 心罪〃 普通会员 1楼

      在 Vue.js 中,如果你使用自定义组件 v-model 来更新数据,但界面不更新,可能有以下几种原因:

      1. 数据绑定顺序问题:在 Vue.js 中,数据绑定通常遵循以下顺序:首先,通过 v-model 绑定数据,然后使用 watch 绑定组件的状态。如果你想直接在组件内部更新数据,但界面不更新,可能是以下原因:

      a. 更新数据的位置:在你的自定义组件中,数据绑定的位置可能会设置得不合理。例如,如果 v-model 绑定在组件的 props 中,那么数据绑定顺序可能会导致数据在组件内部的更新不立即反映到界面。这种情况下,你可以尝试改变数据绑定的位置,例如将 v-model 绑定在组件的 computed 属性或事件处理器中,或者将数据绑定在组件的状态字段中。

      b. 更新数据的触发方式:在组件的状态字段中使用 watch 绑定数据,可能需要将数据更新与组件的其他状态字段一起更新,这会导致数据的更新滞后于界面。例如,如果组件有一个状态字段 currentScore,你可以使用 watch 绑定 currentScore,并在组件的 mounted、updated 或 destroyed 事件中更新状态字段的值。如果在 mounted 事件中更新了状态字段,但界面还未更新,那么可能会出现这种情况。

      c. 更新数据的方法:在自定义组件中,你可能需要直接更新数据,而不是使用 v-modelwatch。在这种情况下,你需要在数据更新方法中使用 Vue.js 的数据属性,而不是组件的 props 或状态字段。例如,如果你有一个计算属性 calculateScore,你可以直接在更新数据的方法中计算新的 score,然后在需要更新界面的地方更新该 score。

      1. 自定义组件的 prop 问题:如果你的自定义组件定义了一个prop,并且在 props 中设置了默认值或初始值,但界面不更新,可能是以下原因:

      a. prop 的更新延迟:prop 是 Vue.js 的一个重要组件属性,它允许你为组件添加自定义属性。如果 prop 的更新延迟过长,那么可能不会立即反映到界面。例如,如果你在组件的状态字段中设置了 currentScore 的初始值为 0,但 prop 的更新延迟为 500ms,那么当你在界面中输入一些值并触发更新事件后,currentScore 的值可能会被更新到 0,但界面可能不会立即更新,而是需要等待一定时间(500ms)之后。

      b. prop 的副作用:如果你在 prop 中使用了触发器或委托操作,那么这可能会导致 prop 的更新延迟。例如,如果你在 prop 中使用了 watch 绑定一个自定义函数,当函数执行时,prop 的值可能会被更新,但界面可能不会立即更新,因为 watch 绑定的回调函数可能在 prop 的更新后才开始执行。

      c. prop 的自定义逻辑:如果你在 prop 中定义了自定义逻辑,例如一个计算函数,那么这可能会导致 prop 的更新延迟。如果自定义逻辑在更新数据之前执行,那么当界面需要更新时,可能需要等待自定义逻辑执行完成。

      如果你的自定义组件中出现了上述问题,你可能需要进一步检查 prop 的设置,组件的状态字段的更新方法,以及 prop 的自定义逻辑。如果问题仍然存在,你可能需要考虑使用 Vue.js 的组件状态字段(如 this.$store.state)或状态变更通知(如 this.$nextTickthis.$apply)来更新界面,而不是直接在组件内部更新数据。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部