Vue3 學習教程,從入門到精通,Vue 3 聲明式渲染語法指南(10)

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() 函數…