V-Modell auf der Div-Tag-Komponente
P粉550823577
P粉550823577 2024-01-07 08:47:44
0
1
445

Die Verwendung von v-modeldiv 标记时出现问题。显然, div 标签不允许 v-model ,我决定将我的评论部分创建为组件。由于 UI/UX 原因,我需要按原样分配此 div 文本区域。 textareainput 等标签,据我所知,这些标签与 contenteditable="true" ist nicht kompatibel. Ich muss die Höhe des Eingabefelds erweitern, wenn der Benutzer einen Kommentar eingibt. Unten ist die Vue-Komponente, die ich in die übergeordnete Ansicht importiert habe.

<!-- CommentSection.vue -->
<template>
    <div id="chatId" contenteditable="true" placeholder="Leave a message" class="overflow-hidden block mx-4 text-left p-2.5 w-full text-sm text-gray-900 bg-white rounded-2xl border border-gray-300 focus:ring-blue-500 focus:border-blue-500"/>
</template>

<style>
#chatId[contenteditable="true"]:empty:not(:focus):before {
    content: attr(placeholder)
}
</style>

In meiner Ansichtsdatei habe ich es importiert und v-model wie folgt darin verwendet.

<!--MainPage.vue-->
<template>
...
...
     <CommentSection v-model="comment"/>
     <button @click="submitPost()"> Submit </button>
...
...
...
</template>
<script>
import CommentSection from '@/components/CommentSection.vue'

export default{
 name: 'MainPage',
      data(){
          return{
            comment: '',
          }
      },
      components: { CommentSection },
      methods:{
          submitPost(){
             console.log(this.comment);
          },
      },
}
</script>

Aber wenn ich die Konsole überprüfe, wird mir der Wert „null“ oder nichts angezeigt. Gibt es eine Möglichkeit, dieses Problem zu lösen? Oder vielleicht ist die Art und Weise, wie ich es implementiert habe, die Ursache des Problems.

EDIT: Hier ist der Code, der in codesandbox ausgeführt wird.

P粉550823577
P粉550823577

Antworte allen(1)
P粉295728625

我解决了你的问题,代码如下。希望对您有所帮助

通过在div标签中添加@,我们可以在change方法中看到标签内容的变化。在该方法中,使用emit$与其他组件共享其值

<!-- CommentSection.vue -->
<template>
    <div id="chatId" @input="chanage" contenteditable="true" placeholder="Leave a message" class="overflow-hidden block mx-4 text-left p-2.5 w-full text-sm text-gray-900 bg-white rounded-2xl border border-gray-300 focus:ring-blue-500 focus:border-blue-500"/>
</template>

<script>
export default {
  methods: {
    chanage (e) {
      this.$emit('value-div', e.target.textContent)
    }
  }
}
</script>

<style>
#chatId[contenteditable="true"]:empty:not(:focus):before {
    content: attr(placeholder)
}
</style>

这里我们有 $emit 创建的 props,我们在 comment 变量中初始化它的值。其实它有类似v-model的功能。

<!--MainPage.vue-->
<template>
...
...
     <CommentSection @value-div="(value)=>comment = value"/>
     <button @click="submitPost()"> Submit </button>
...
...
...
</template>
<script>
import CommentSection from '@/components/CommentSection.vue'

export default{
 name: 'MainPage',
      data(){
          return{
            comment: '',
          }
      },
      components: { CommentSection },
      methods:{
          submitPost(){
             console.log(this.comment);
          },
      },
}
</script>
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!