Vue 3 声明式渲染语法指南

本文将详细介绍 Vue 3 中的声明式渲染语法,涵盖所有核心概念,并通过一个完整的案例代码进行演示。案例代码中包含详细注释,帮助初学者更好地理解每个部分的功能和用法。

目录

  1. 简介
  2. 声明式渲染基础
    • 文本插值
    • 属性绑定
    • 使用 JavaScript 表达式
  3. 指令
    • v-bind
    • v-on
    • v-model
    • v-if, v-else-if, v-else
    • v-for
    • v-show
  4. 计算属性和侦听器
    • 计算属性
    • 侦听器
  5. 案例代码:简单的待办事项应用
    • 项目结构
    • 完整代码
  6. 总结

简介

Vue 3 是一个用于构建用户界面的渐进式 JavaScript 框架。它采用声明式渲染,使得开发者能够以简洁、直观的方式描述 UI 的状态和变化。本文将介绍 Vue 3 中声明式渲染的核心语法,并通过一个实际的案例帮助理解。

声明式渲染基础

文本插值

使用双大括号 {{ }} 可以将数据绑定到模板中的文本节点。

<template><div><p>你好,{{ username }}!</p></div>
</template><script>
export default {data() {return {username: 'Vue 开发者'};}
};
</script>

属性绑定

使用 v-bind 指令(或其简写 :)将数据绑定到 HTML 属性上。

<template><div><img v-bind:src="imageUrl" alt="Vue Logo"><!-- 简写 --><img :src="imageUrl" alt="Vue Logo"></div>
</template><script>
export default {data() {return {imageUrl: 'https://vuejs.org/images/logo.png'};}
};
</script>

使用 JavaScript 表达式

在模板中可以使用 JavaScript 表达式进行简单的计算或逻辑处理。

<template><div><p>1 + 1 = {{ 1 + 1 }}</p><p>反转后的用户名: {{ username.split('').reverse().join('') }}</p></div>
</template><script>
export default {data() {return {username: 'Vue 开发者'};}
};
</script>

指令

v-bind

用于动态绑定 HTML 属性或组件的 props。

<!-- 绑定属性 -->
<a v-bind:href="url">访问网站</a>
<!-- 简写 -->
<a :href="url">访问网站</a>

v-on

用于监听 DOM 事件。

<!-- 监听点击事件 -->
<button v-on:click="handleClick">点击我</button>
<!-- 简写 -->
<button @click="handleClick">点击我</button>

v-model

用于在表单控件元素或组件上创建双向数据绑定。

<template><div><input v-model="message" placeholder="输入内容"><p>你输入的内容是: {{ message }}</p></div>
</template><script>
export default {data() {return {message: ''};}
};
</script>

v-if, v-else-if, v-else

根据条件渲染元素。

<template><div><p v-if="isLoggedIn">欢迎回来!</p><p v-else>请登录。</p></div>
</template><script>
export default {data() {return {isLoggedIn: true};}
};
</script>

v-for

用于渲染列表。

<template><div><ul><li v-for="(item, index) in items" :key="index">{{ item }}</li></ul></div>
</template><script>
export default {data() {return {items: ['苹果', '香蕉', '橘子']};}
};
</script>

v-show

根据条件显示或隐藏元素(通过 CSS 控制显示)。

<template><div><p v-show="isVisible">这是一个可见的段落。</p></div>
</template><script>
export default {data() {return {isVisible: true};}
};
</script>

计算属性和侦听器

计算属性

计算属性是基于它们的依赖进行缓存的,只有在相关依赖发生改变时才会重新求值。

<template><div><p>原始消息: {{ message }}</p><p>反转后的消息: {{ reversedMessage }}</p></div>
</template><script>
export default {data() {return {message: 'Hello Vue!'};},computed: {reversedMessage() {return this.message.split('').reverse().join('');}}
};
</script>

侦听器

侦听器用于在数据变化时执行异步或开销较大的操作。

<template><div><input v-model="question" placeholder="输入问题"><p>{{ answer }}</p></div>
</template><script>
export default {data() {return {question: '',answer: '等待输入...'};},watch: {question(newQuestion) {if (newQuestion.trim()) {this.answer = '正在思考...';// 模拟异步操作setTimeout(() => {this.answer = `你问的问题是: ${newQuestion}`;}, 2000);} else {this.answer = '等待输入...';}}}
};
</script>

案例代码:简单的待办事项应用

下面是一个简单的待办事项应用示例,展示了 Vue 3 的声明式渲染语法。该应用允许用户添加、删除和标记待办事项。

项目结构

src/
│
├── components/
│   └── TodoItem.vue
│
├── App.vue
│
└── main.js

完整代码

1. main.js
// main.js
import { createApp } from 'vue';
import App from './App.vue';createApp(App).mount('#app');
2. App.vue
<!-- App.vue -->
<template><div id="app"><h1>我的待办事项</h1><input v-model="newTodo" @keyup.enter="addTodo" placeholder="添加待办事项" /><button @click="addTodo">添加</button><ul><TodoItemv-for="(todo, index) in todos":key="index":todo="todo"@delete="deleteTodo(index)"@toggle="toggleTodo(index)"/></ul><p>{{ remaining }} 个待办事项未完成。</p></div>
</template><script>
import TodoItem from './components/TodoItem.vue';export default {components: {TodoItem},data() {return {newTodo: '',todos: []};},computed: {remaining() {return this.todos.filter(todo => !todo.completed).length;}},methods: {addTodo() {const trimmedTodo = this.newTodo.trim();if (trimmedTodo) {this.todos.push({ text: trimmedTodo, completed: false });this.newTodo = '';}},deleteTodo(index) {this.todos.splice(index, 1);},toggleTodo(index) {this.todos[index].completed = !this.todos[index].completed;}}
};
</script><style>
#app {font-family: Arial, sans-serif;max-width: 600px;margin: 0 auto;padding: 20px;
}
input {padding: 8px;width: 70%;margin-right: 10px;
}
button {padding: 8px;
}
ul {list-style-type: none;padding: 0;
}
li {margin: 10px 0;display: flex;align-items: center;
}
.completed {text-decoration: line-through;color: gray;
}
</style>
3. TodoItem.vue
<!-- TodoItem.vue -->
<template><li><input type="checkbox" v-model="todo.completed" @change="toggle" /><span :class="{ completed: todo.completed }">{{ todo.text }}</span><button @click="deleteItem">删除</button></li>
</template><script>
export default {props: {todo: {type: Object,required: true}},methods: {deleteItem() {this.$emit('delete');},toggle() {this.$emit('toggle');}}
};
</script><style scoped>
.completed {text-decoration: line-through;color: gray;
}
button {margin-left: 10px;padding: 4px;
}
</style>

代码解析

  1. 主应用 (App.vue):

    • 数据 (data):
      • newTodo: 用于存储用户输入的新待办事项。
      • todos: 存储所有待办事项的数组。
    • 计算属性 (computed):
      • remaining: 计算未完成的待办事项数量。
    • 方法 (methods):
      • addTodo: 添加新的待办事项到 todos 数组中。
      • deleteTodo: 删除指定索引的待办事项。
      • toggleTodo: 切换指定索引的待办事项的完成状态。
    • 模板 (template):
      • 使用 v-model 实现输入框与 newTodo 的双向绑定。
      • 使用 @keyup.enter 监听回车键事件,调用 addTodo 方法。
      • 使用 v-for 指令遍历 todos 数组,渲染每个待办事项。
      • 使用 v-bind 动态绑定 TodoItem 组件的 todo prop。
      • 使用 @delete@toggle 监听子组件的 deletetoggle 事件,调用相应的方法。
      • 显示剩余的未完成待办事项数量。
  2. 子组件 (TodoItem.vue):

    • Props (props):
      • todo: 接收单个待办事项对象。
    • 方法 (methods):
      • deleteItem: 触发 delete 事件,通知父组件删除当前待办事项。
      • toggle: 触发 toggle 事件,通知父组件切换当前待办事项的完成状态。
    • 模板 (template):
      • 使用 v-model 实现复选框与 todo.completed 的双向绑定。
      • 使用 :class 动态绑定样式类 completed,根据 todo.completed 的值决定是否添加。
      • 使用 @click 监听删除按钮的点击事件,调用 deleteItem 方法。
  3. 样式 (style):

    • 使用 scoped 样式,确保样式只作用于当前组件。
    • .completed 类用于显示删除线,标识已完成的待办事项。

总结

本文详细介绍了 Vue 3 中的声明式渲染语法,涵盖了文本插值、属性绑定、指令、计算属性和侦听器等核心概念。通过一个简单的待办事项应用示例,展示了如何将这些概念应用到实际项目中。掌握这些基础知识后,开发者可以进一步探索 Vue 3 的其他高级特性,如组件化、路由管理、状态管理等,以构建更复杂和功能丰富的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915370.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915370.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915370.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React hooks——useReducer

一、简介useReducer 是 React 提供的一个高级 Hook&#xff0c;用于管理复杂的状态逻辑。它类似于 Redux 中的 reducer 模式&#xff0c;适合处理包含多个子值、依赖前一个状态或逻辑复杂的状态更新场景。与 useState 相比&#xff0c;useReducer 提供更结构化的状态管理方式。…

SEO中关于关键词分类与布局的方法有那些

前边我们说到关键词挖掘肯定很重要&#xff0c;但如何把挖掘出来的关键词用好更为重要&#xff0c;下边我们就来说说很多seo刚入行的朋友比较头疼的关键词分类问题&#xff0c;为了更直观的感受搭配了表格&#xff0c;希望可以给大家一些帮助!SEO优化之关键词分类​挖掘出的关键…

考研最高效的准备工作是什么

从性价比的角度来说&#xff0c;考研最高效的准备工作是什么呢&#xff1f; 其实就是“卷成绩”。 卷学校中各门课程的成绩&#xff0c;卷考研必考的数学、英语、政治和专业课的成绩。 因为现阶段的考研&#xff0c;最看重的仍然是你的成绩&#xff0c;特别是初试成绩。 有了…

【Linux】基于Ollama和Streamlit快速部署聊天大模型

1.环境准备 1.1 安装Streamlit 在安装Streamlit之前&#xff0c;请确保您的系统中已经正确安装了Python和pip。您可以在终端或命令行中运行以下命令来验证它们是否已安装 python --version pip --version一旦您已经准备好环境&#xff0c;现在可以使用pip来安装Streamlit了。…

Jetpack - ViewModel、LiveData、DataBinding(数据绑定、双向数据绑定)

一、ViewModel 1、基本介绍 ViewModel 属于 Android Jetpack 架构组件的一部分&#xff0c;ViewModel 被设计用来存储和管理与 UI 相关的数据&#xff0c;这些数据在配置更改&#xff08;例如&#xff0c;屏幕旋转&#xff09;时能够幸存下来&#xff0c;ViewModel 的生命周期与…

Go并发聊天室:从零构建实战

大家好&#xff0c;今天我将分享一个使用Go语言从零开始构建的控制台并发聊天室项目。这个项目虽然简单&#xff0c;但它麻雀虽小五脏俱全&#xff0c;非常适合用来学习和实践Go语言强大的并发特性&#xff0c;尤其是 goroutine 和 channel 的使用。 一、项目亮点与功能特性 …

疯狂星期四第13天运营日报

网站运营第13天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 昨日访问量 昨天大概60个ip, 同比上个星期是高点的&#xff0c;但是与星期四差别还是太大了。&#x1f602; 昨日搜索引擎收录情况 百度依旧0收录 …

吴恩达《AI for everyone》第二周课程笔记

机器学习项目工作流程以Echo/Alexa&#xff08;语音识别AI&#xff09;作为例子解释&#xff1a; 1. collect data 收集数据——人为找很多人说 Alexa&#xff0c;并录制音频&#xff1b;并且还会让一群人说其他词语&#xff0c;比如hello 2. train model 训练模型——用机器学…

uniapp props、$ref、$emit、$parent、$child、$on

1. uniapp props、ref、ref、ref、emit、parent、parent、parent、child、$on 1.1. 父组件和子组件 propsPage.vue导入props-son-view.vue组件的时候,我们就称index.vue为父组件依次类推,在vue中只要能获取到组件的实例,那么就可以调用组件的属性或是方法进行操作 1.2. pr…

4、ubuntu | dify创建知识库 | 上市公司个股研报知识库

1、创建知识库步骤 创建一个知识库并上传相关文档主要涉及以下五个关键步骤&#xff1a; 创建知识库&#xff1a;首先&#xff0c;需要创建一个新的知识库。这可以通过上传本地文件、从在线资源导入数据或者直接创建一个空的知识库来实现。 指定分段模式&#xff1a;接下来是…

Kubernetes中为Elasticsearch配置多节点共享存储

在Kubernetes中为Elasticsearch配置多节点共享存储(ReadWriteMany)需结合存储后端特性及Elasticsearch架构设计。 由于Elasticsearch默认要求每个节点独立存储数据(ReadWriteOnce),直接实现多节点共享存储需特殊处理。 ​​方案一:使用支持ReadWriteMany的存储后端(推荐…

SpringBoot热部署与配置技巧

配置文件SpringBoot 的热部署Spring为开发者提供了一个名为spring-boot-devtools的模块来使SpringBoot应用支持热部署&#xff0c;提高开发者的开发效率&#xff0c;无需手动重启SpringBoot应用相关依赖&#xff1a;<dependency> <groupId>org.springframework.boo…

Python与C#的三元运算符的写法区别

一、语法结构对比​​PyTorch示例​​dev torch.device("cuda:0" if torch.cuda.is_available() else "cpu")​​逻辑​​&#xff1a;若torch.cuda.is_available()为真&#xff0c;则返回"cuda:0"&#xff0c;否则返回"cpu"。​​作…

java 学习篇一

java知识点 一、windows不区分大小写&#xff0c;linux区分大小写 二、写java需要JDK&#xff0c;一般运行环境需要JRE 三、JDK安装一般是傻瓜是安装 四、java主要工具javac、java&#xff1b;其中javac用于编译.java -> .class&#xff1b;java用于执行.class文件执行时候不…

仙盟数据库应用-外贸标签打印系统 前端数据库-V8--毕业论文-—-—仙盟创梦IDE

基于 Excel 标签打印软件的外贸打印流程优化与实践摘要&#xff1a;在全球化外贸业务中&#xff0c;标签打印是货物流通、信息标识的关键环节。本文聚焦 “未来之窗云上打印技术” 的 Excel 标签打印软件&#xff0c;结合外贸平台实际场景&#xff0c;分析其在打印流程中的应用…

【Linux】权限详解 权限本质、权限属性、su、sudo提权、chmod\chown\chgrp、文件类别

文章目录一、权限的认识二、linux的权限本质三、linux的用户su指令sudo提权四、linux角色五、文件权限属性六、修改权限的指令操作chmod指令(权限只会验证一次)chown/chgrp指令修改文件权限的八进制方案七、文件类别详解一、权限的认识 什么是权限&#xff1f; 生活中处处都有权…

rman清理归档

1进入rman rman target / 2&#xff1a;列出所有归档日志的路径 LIST ARCHIVELOG ALL; 3.然后在执行 crosscheck archivelog all;&#xff08;检查 RMAN 存储库中记录的归档日志是否在磁盘或备份存储中实际存在。 4.然后在执行 delete noprompt expired archivelog all;&…

Selenium 处理动态网页与等待机制详解

在使用 Selenium 进行网页自动化操作时&#xff0c;动态网页往往是开发者遇到的第一个 “拦路虎”。想象一下&#xff1a;你明明在代码中写好了元素定位逻辑&#xff0c;运行时却频繁报错 “元素不存在”&#xff0c;但手动打开网页时元素明明就在眼前 —— 这很可能是因为网页…

Salesforce 与外部系统实时集成:基于事件驱动的异步集成架构

在 Salesforce 与外部系统&#xff08;如 ERP、财务系统、物流系统等&#xff09;的实时集成中&#xff0c;“稳定性” 是核心挑战 —— 既要保证数据同步的及时性&#xff0c;又要应对网络波动、系统故障、并发冲突等不可控因素。以下从问题本质、技术瓶颈、解决方案细节三个维…

React 的 `cache()` 函数

文章目录前言一、核心作用二、工作原理三、使用场景1. 避免重复数据请求2. 优化昂贵计算四、缓存规则详解五、与其它缓存方式对比六、服务端特殊行为七、最佳实践八、缓存失效策略九、使用限制十、与数据获取库集成总结&#xff1a;何时使用 cache()前言 React 的 cache() 函数…