讲师中心 微信公众号
AI工具推荐 视频效率加速

Vue 3 v-model在textarea中预填充动态数据的最佳实践

风婷同学_6884

风婷同学_6884

发布时间:2025-09-23 12:13:24

|

279人浏览过

|

来源于php中文网

原创

Vue 3 v-model在textarea中预填充动态数据的最佳实践

本文详细探讨了在Vue 3的script setup中使用v-model绑定textarea时,如何正确预填充来自数据库或其他动态源的数据。核心在于理解v-model作为唯一数据源的机制,避免在

在vue中,v-model指令用于在表单输入元素上创建双向数据绑定。对于

核心原理: v-model是表单元素的“单一事实来源”。一旦使用了v-model,你就不应该再在

常见问题与误区

当尝试使用动态数据(例如从数据库加载的article.header)预填充textarea时,开发者常遇到以下问题:

  1. 在

    <textarea v-model="form.header">{{ article.header }}</textarea>

    这种写法会导致article.header的值不会显示,因为v-model="form.header"已经完全控制了

    立即学习“前端免费学习笔记(深入)”;

  2. reactive对象初始化时数据未定义:

    let form = reactive({
      header: article.header, // article.header 可能在此处未定义
    });

    在script setup的顶层,article.header(如果它来自父组件的props或异步数据)可能在reactive对象初始化时尚未可用,导致header属性被初始化为undefined。

正确预填充textarea的方案

解决上述问题的关键在于两点:移除冗余的插值表达式和确保v-model绑定的数据属性在初始化时能获取到正确的值。

步骤一:移除

首先,确保你的

<textarea
  v-model="form.header"
  @input="onInputheader"
></textarea>

@input事件监听器是可选的,如果你有额外的输入处理逻辑,可以保留。

vue-admin-change-reviewer
vue-admin-change-reviewer

审查 Vue 管理后台的变更请求(Vue 2 + Element UI,Vue 3 + Element Plus)。重点关注最小化变更实现、上线风险检查以及回归检查清单生成。

下载

步骤二:正确初始化v-model绑定的数据属性

form.header的值需要在article.header可用时进行设置。这通常意味着article数据是通过props传递进来的,或者是在组件内部异步获取的。

情景一:article作为props传递

如果article是通过父组件作为prop传递给当前组件的,你可以在组件初始化时将prop的值赋给reactive对象中的相应属性。

<script setup>
import { reactive, watch } from 'vue';

// 定义接收的props
const props = defineProps({
  article: {
    type: Object,
    default: () => ({ header: '' }) // 提供默认值以防万一
  }
});

// 定义响应式表单数据
let form = reactive({
  header: '', // 初始值可以为空字符串
});

// 监听props.article的变化,并在变化时更新form.header
// 这样可以确保在article数据可用时,form.header被正确赋值
watch(() => props.article, (newArticle) => {
  if (newArticle && newArticle.header !== undefined) {
    form.header = newArticle.header;
  }
}, { immediate: true }); // immediate: true 确保在组件挂载时立即执行一次

// 假设你有一个输入处理函数
const onInputheader = (event) => {
  // console.log('Textarea input:', event.target.value);
  // form.header 已经通过 v-model 自动更新,这里可以添加其他逻辑
};
</script>

<template>
  <div>
    <label for="articleHeader">文章标题</label>
    <textarea
      id="articleHeader"
      v-model="form.header"
      @input="onInputheader"
      rows="5"
      cols="50"
      placeholder="请输入文章标题"
    ></textarea>
    <p>当前输入: {{ form.header }}</p>
  </div>
</template>

代码解释:

  • defineProps用于声明组件接收的props。
  • reactive用于创建响应式对象form。
  • watch函数在这里至关重要。它监听props.article的变化。当article对象(或其header属性)从父组件传递进来或更新时,watch回调函数会被触发,从而将newArticle.header的值赋给form.header。
  • { immediate: true }选项确保了watch回调在组件初次渲染时也会立即执行一次,这样即使article在组件挂载时就已经有值,form.header也能被正确初始化。

情景二:article在组件内部异步获取

如果article数据是在当前组件内部通过API请求等方式异步获取的,你可以在数据获取成功后,直接更新form.header。

<script setup>
import { reactive, onMounted } from 'vue';

let form = reactive({
  header: '',
});

// 模拟异步数据获取
const fetchArticleData = async () => {
  // 假设这里是API调用
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({ header: '这是从数据库加载的文章标题内容。' });
    }, 1000); // 模拟1秒延迟
  });
};

onMounted(async () => {
  const articleData = await fetchArticleData();
  if (articleData && articleData.header !== undefined) {
    form.header = articleData.header;
  }
});

const onInputheader = (event) => {
  // ... 其他逻辑
};
</script>

<template>
  <div>
    <label for="articleHeader">文章标题</label>
    <textarea
      id="articleHeader"
      v-model="form.header"
      @input="onInputheader"
      rows="5"
      cols="50"
      placeholder="请输入文章标题"
    ></textarea>
    <p>当前输入: {{ form.header }}</p>
  </div>
</template>

注意事项与最佳实践

  • v-model是王道: 始终记住v-model是表单输入元素值的唯一来源。避免任何可能与之冲突的写法。
  • 数据可用性: 确保你在尝试将动态数据赋值给v-model绑定的属性时,该数据(例如article.header)是已经可用且有值的。使用watch监听props或在onMounted中处理异步数据是常见的策略。
  • 默认值: 为reactive对象中的属性提供合理的默认值(例如空字符串''),以避免在数据加载完成前出现undefined或null的显示问题。
  • 类型检查: 在赋值前进行简单的null或undefined检查(if (newArticle && newArticle.header !== undefined))可以增加代码的健壮性。

总结

在Vue 3中使用v-model预填充textarea时,关键在于遵循v-model作为单一数据源的原则,避免在

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2824

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5929

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7534

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11214

2024.04.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn