Maison  >  Questions et réponses  >  le corps du texte

Modèle V sur le composant de balise div

L'utilisation de v-modeldiv 标记时出现问题。显然, div 标签不允许 v-model ,我决定将我的评论部分创建为组件。由于 UI/UX 原因,我需要按原样分配此 div 文本区域。 textareainput 等标签,据我所知,这些标签与 contenteditable="true"; n'est pas compatible ; j'ai besoin que la hauteur du champ de saisie s'agrandisse lorsque l'utilisateur saisit un commentaire. Vous trouverez ci-dessous le composant vue que j'ai importé dans la vue parent.

<!-- 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>

Dans mon fichier de vue, je l'ai importé et utilisé v-model dedans, comme ça.

<!--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>

Mais quand je vérifie la console elle me donne la valeur "null" ou rien. Existe-t-il un moyen de résoudre ce problème ? Ou peut-être que la façon dont je l'ai implémenté est à l'origine du problème.

EDIT : Voici le code exécuté dans codesandbox.

P粉550823577P粉550823577286 Il y a quelques jours469

répondre à tous(1)je répondrai

  • P粉295728625

    P粉2957286252024-01-08 00:12:08

    J'ai résolu votre problème, le code est le suivant. J'espère que cela vous aidera

    En ajoutant @ dans la balise div, nous pouvons voir le changement du contenu de la balise dans la méthode de changement. Dans cette méthode, utilisez submit$ pour partager sa valeur avec d'autres composants

    <!-- 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>

    Ici nous avons les props créés par $emit et nous initialisons sa valeur dans la variable de commentaire. En fait, il a des fonctions similaires au 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>

    répondre
    0
  • Annulerrépondre