模板语法渲染

写博客项目第一步,是学会把数据"渲染"到页面上。Vue3 的模板语法让 HTML 直接与数据绑定:插值表达式、v-text/v-html、v-bind、v-for、v-if 是最常用的几种,本节结合文章列表逐一演示。

插值表达式 {{ }}

双大括号把变量的值输出到标签内容中:

<template>
  <h1>{{ siteName }}</h1>
  <p>共 {{ posts.length }} 篇文章</p>
</template>

<script setup>
import { ref } from 'vue'
import { posts } from '../data/posts'

const siteName = ref('我的技术博客')
</script>

效果:页面显示"我的技术博客"与"共 2 篇文章"。插值里可以写简单表达式,如 posts.length。

v-text 与 v-html

v-text 等价于插值(输出纯文本);v-html 则把内容当作 HTML 解析渲染,适合文章正文这类带标签的数据:

<template>
  <div v-text="post.summary"></div>   <!-- 纯文本 -->
  <div v-html="post.content"></div>   <!-- 解析 HTML -->
</template>

注意:v-html 有 XSS 风险,只对可信内容(如自己维护的正文)使用,不要直接渲染用户输入。

v-bind 动态绑定属性

属性(href、class、src 等)不能用插值,要用 v-bind(简写 :)。为每篇文章生成跳转链接:

<template>
  <a :href="'/post/' + post.id">阅读全文 →</a>
  <span v-if="post.hot" class="badge">热门</span>
</template>

效果:文章 id 为 2 时链接渲染成 /post/2;post.hot 为真时才显示"热门"徽标。

v-for 渲染文章列表

遍历数组重复生成节点,记得写 key 以便复用:

<template>
  <article v-for="post in posts" :key="post.id">
    <h2>{{ post.title }}</h2>
    <p>{{ post.summary }}</p>
    <span v-for="tag in post.tags" :key="tag">#{{ tag }} </span>
  </article>
</template>

效果:有几篇文章就渲染几张卡片,标签用内层 v-for 逐个输出为 #Vue3 #Pinia。

v-if / v-else 处理空状态

列表为空时给用户友好提示,比白屏强得多:

<template>
  <p v-if="posts.length === 0">还没有文章,敬请期待~</p>
  <ul v-else>
    <li v-for="post in posts" :key="post.id">{{ post.title }}</li>
  </ul>
</template>

效果:数据为空时显示提示文案;有数据时显示列表,二者互斥出现。

小结

插值、v-text/v-html、v-bind、v-for、v-if 是模板渲染的常用指令,文章列表页已经能"长"出来了。下一节把卡片抽成 PostCard 组件,让页面结构更清晰。

笔记加载中…