v-model< component>在Vue 3中不工作?

fcg9iug3  于 2023-04-21  发布在  Vue.js
关注(0)|答案(1)|浏览(185)

在下面的例子中,为什么v-model没有绑定到我的输入?<component>有限制吗?

<script setup>
import { ref } from 'vue'

const config = ref({
  headers: [
    { field: 'id', label: 'Id', component: { type: 'input' } }, 
    { field: 'name', label: 'Name', component: { type: 'input' }  },
    // more configs for radio buttons and other custom components
  ],
  data: [
    { id: 1, name: 'foo' },
    { id: 2, name: 'bar' }
  ]
})
</script>

<template>
  <table>
    <tr>
      <td v-for="header in config.headers">
        <b>{{ header.label }}</b>
      </td>
    </tr>
    <tr v-for="item in config.data">
      <td v-for="header in config.headers">
        <component :is="header.component.type" v-model="item[header.field]" />
      </td>
    </tr>
  </table>
  {{ config.data }}
</template>
zlhcx6iw

zlhcx6iw1#

Vuev-model对于原生元素确实工作得很好。
但它显然无法与<component :is一起工作
您的代码生成

<input modelvalue="foo">

快速的解决方法是直接实现value的绑定。

:value="item[header.field]" @input="item[header.field] = $event.target.value"

但是,您需要相应地更新组件,以便使用value而不是modelValue

更新

使用v-model:value的解决方法只能以一种方式工作,与:value相同。

<component :is="header.component.type" v-model:value="item[header.field]" />
const { createApp, ref } = Vue

const config = ref({
  headers: [
    { field: 'id', label: 'Id', component: { type: 'input' } }, 
    { field: 'name', label: 'Name', component: { type: 'input' }  },
    // more configs for radio buttons and other custom components
  ],
  data: [
    { id: 1, name: 'foo' },
    { id: 2, name: 'bar' }
  ]
})

const App = {
  setup() {
    return { config, test: 1 }  
  }
}

const app = createApp(App)
app.mount('#app')
#app { line-height: 1.75; }
[v-cloak] { display: none; }
<div id="app">
<table>
    <tr>
      <td v-for="header in config.headers">
        <b>{{ header.label }}</b>
      </td>
    </tr>
    <tr v-for="item in config.data">
      <td v-for="header in config.headers">
        <component :is="header.component.type" :value="item[header.field]" @input="item[header.field] = $event.target.value" />
      </td>
    </tr>
  </table>
  {{ config.data }}
  <hr/>
  v-model test: <input v-model="test" />
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>

相关问题