Vue3概念关系与重点摘要
重点摘要
基础概念
-
什么是vue
简单来说就是一款构建用户界面的JavaScript 框架。基于HTML、CSS 和 JavaScript 构建,提供了一些声明式的、组件化的编程模型。搭配各大厂商自研的UI框架(Element、Ant Design Vue)可以快速实现用户的大多数场景。
-
主要核心
- 声明式渲染:基于HTML拓展拓展的模版语法。
- 响应性:实时响应式更新DOM
-
最简单的实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 测试实例</title> <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script> </head> <body> <div id="hello-vue" class="demo"> {{ message }} </div> <script> const HelloVueApp = { data() { return { message: 'Hello Vue!!' } } } Vue.createApp(HelloVueApp).mount('#hello-vue') </script> </body> </html>
模版语法
-
文本
数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值:
<div id="app"> <p>{{ message }}</p> </div>
如果 message 属性的值发生了改变,{{...}} 标签内容也会更新。
-
Html
一般使用
v-html
指令用于输出html代码:<div id="example1" class="demo"> <p>使用双大括号的文本插值: {{ rawHtml }}</p> <p>使用 v-html 指令: <span v-html="rawHtml"></span></p> </div> <script> const RenderHtmlApp = { data() { return { rawHtml: '<span style="color: red">这里会显示红色!</span>' } } } Vue.createApp(RenderHtmlApp).mount('#example1') </script>
-
属性
HTML 属性中的值使用
v-bind
指令:<div v-bind:class="{'class1': use}"> v-bind:class 指令 </div>
判断use的值,为true使用class1类的样式,否则不使用
-
表达式
可在
{{ }}
内写入表达式 无法写入语句
<div id="app"> {{5+5}}<br> {{ ok ? 'YES' : 'NO' }}<br> {{ message.split('').reverse().join('') }} </div> <script> const app = { data() { return { ok: true, message: 'qwertyui!!' } } } Vue.createApp(app).mount('#app') </script>
-
指令
指令是带有 v- 前缀的特殊属性,用于在表达式的值改变时,将某些行为应用到 DOM 上。
v-if
指令 判断某个值 来决定是否执行<div id="app"> <p v-if="seen">测试测试</p> </div> <script> const app = { data() { return { seen: true /* 改为false,信息就无法显示 */ } } } Vue.createApp(app).mount('#app') </script>
v-for
指令可以绑定数组的数据来渲染一个项目列表<div id="app"> <ol> <li v-for="site in sites"> {{ site.text }} </li> </ol> </div> <script> const app = { data() { return { sites: [ { text: 'xx' }, { text: 'ss' }, { text: 'qq' } ] } } } Vue.createApp(app).mount('#app') </script>
-
参数
参数在指令后以冒号指明。
<!-- class 为参数 --> <div v-bind:class="{'class1': use}"> v-bind:class 指令 </div>
-
用户输入
input
为用户输入框,一般配合v-model
使用:<div id="app"> <p>{{ message }}</p> <input v-model="message"> </div> <script> const app = { data() { return { message: '' } } } Vue.createApp(app).mount('#app') </script
-
缩写
<!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a> <!-- 完整语法 --> <a v-on:click="doSomething"></a> <!-- 缩写 --> <a @click="doSomething"></a>
条件语句
-
v-if
条件判断使用
v-if
指令,指令的表达式返回 true 时才会显示 -
v-else
配合
v-if
使用,无法单独使用,用于给v-if
添加一个else
块 -
v-else-if
v-else-if
即v-if
的else-if
块 ,无法单独使用 -
v-show
使用
v-show
指令来根据条件展示元素:<!-- 判断ok的值 来进行展示 --> <h1 v-show="ok">Hello!</h1>
循环语句
-
迭代数组
<div id="app"> <ol> <li v-for="site in sites"> {{ site.text }} </li> </ol> </div> <script> const app = { data() { return { sites: [ { text: 'xx' }, { text: 'ss' }, { text: 'qq' } ] } } } Vue.createApp(app).mount('#app') </script>
-
第二个参数(索引)
<div id="app"> <ol> <li v-for="(site, index) in sites"> {{index}} -- {{ site.text }} </li> </ol> </div> <script> const app = { data() { return { sites: [ { text: 'xx' }, { text: 'ss' }, { text: 'qq' } ] } } } Vue.createApp(app).mount('#app') </script>
-
迭代对象
<div id="app"> <ul> <!-- 迭代 value --> <li v-for="value in object"> {{ value }} </li> </ul> </div> <script> const app = { data() { return { object: { name: 'wxs', age: '8', slogan: '噢力给' } } } } Vue.createApp(app).mount('#app') </script>
<div id="app"> <ul> <!-- 迭代 key value --> <li v-for="(value, key) in object"> {{ key }} : {{ value }} </li> </ul> </div> <script> const app = { data() { return { object: { name: 'wxs', age: '8', slogan: '噢力给' } } } } Vue.createApp(app).mount('#app') </script>
<div id="app"> <ul> <!-- 迭代 key value 并添加索引--> <li v-for="(value, key, index) in object"> {{ index }}. {{ key }} : {{ value }} </li> </ul> </div> <script> const app = { data() { return { object: { name: 'wxs', age: '8', slogan: '噢力给' } } } } Vue.createApp(app).mount('#app') </script>
组件
-
简单实例
<div id="app"> <testtest></testtest> </div> <script> // 创建一个Vue 应用 const app = Vue.createApp({}) // 定义一个名为 testtest 的新全局组件 app.component('testtest', { template: '<h1>自定义组件!</h1>' }) app.mount('#app') </script>
-
button组件
<div id="app"> <button-counter></button-counter> </div> <script> // 创建一个Vue 应用 const app = Vue.createApp({}) // 定义一个名为 button-counter 的新全局组件 app.component('button-counter', { data() { return { count: 0 } }, template: ` <button @click="count++"> 点了 {{ count }} 次! </button>` }) app.mount('#app') </script>
-
局部组件
<div id="app"> <local-a></local-a> </div> <script> var localA = { template: '<h1>自定义组件!</h1>' } const app = Vue.createApp({ components: { 'local-a': localA } }) app.mount('#app') </script>
-
Prop
prop 是子组件用来接受父组件传递过来的数据的一个自定义属性
<div id="app"> <name title="xx"></name> <name title="ss"></name> <name title="qq"></name> </div> <script> const app = Vue.createApp({}) app.component('name', { <!-- 父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop" --> props: ['title'], template: `<h4>{{ title }}</h4>` }) app.mount('#app') </script>
计算属性--computed
在处理一些复杂逻辑时使用
-
实例
<div id="app"> <p>原始字符串: {{ message }}</p> <p>计算后反转字符串: {{ reversedMessage }}</p> </div> <script> const app = { data() { return { message: 'wxs' } }, computed: { // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } } Vue.createApp(app).mount('#app') </script>
-
computed vs methods
我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。
监听属性
监听属性 watch 检测响应数据,检测到数据发送变化执行
-
实例
<div id = "app"> <p style = "font-size:25px;">计数器: {{ counter }}</p> <!-- counter++ 为 counter + 1 counter-- 为 counter - 1 --> <button @click = "counter++" style = "font-size:25px;">点我</button> </div> <script> const app = { data() { return { counter: 1 } } } vm = Vue.createApp(app).mount('#app') vm.$watch('counter', function(nval, oval) { alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!'); }); </script>
事件处理
使用 v-on 指令来监听 DOM 事件,从而执行 JavaScript 代码。
v-on 指令可以缩写为 @ 符号
-
基础语法
v-on:click="methodName" 或 @click="methodName"
-
接收一个定义的方法来调用
<div id="app"> <!-- `greet` 是在下面定义的方法名 --> <button @click="greet">点我</button> </div> <script> const app = { data() { return { name: 'wxs' } }, methods: { greet(event) { // `methods` 内部的 `this` 指向当前活动实例 alert('Hello ' + this.name + '!') // `event` 是原生 DOM event if (event) { alert(event.target.tagName) } } } } Vue.createApp(app).mount('#app') </script>
表单
-
输入框
<input> <!-- 普通输入框 --> <textarea></textarea> <!-- 文本域 -->
-
单选框/复选
<div id="app"> <p>单个复选框:</p> <input type="checkbox" id="checkbox" v-model="checked"> <label for="checkbox">{{ checked }}</label> <p>多个复选框:</p> <input type="checkbox" id="a" value="a" v-model="checkedNames">a <input type="checkbox" id="b" value="b" v-model="checkedNames">b <input type="checkbox" id="c" value="c" v-model="checkedNames">c <br> <span>选择的值为: {{ checkedNames }}</span> </div> <script> const app = { data() { return { checked : false, checkedNames: [] } } } Vue.createApp(app).mount('#app') </script>
-
下拉框
<div id="app"> <select v-model="selected" name="site"> <option value="">选择一个网站</option> <option value="www.baidu.com">www.baidu.com</option> <option value="www.google.com">www.google.com</option> </select> </div> <script> const app = { data() { return { } } } Vue.createApp(app).mount('#app') </script>
钩子函数
created
: 在绑定元素的属性或事件监听器被应用之前调用。beforeMount
: 指令第一次绑定到元素并且在挂载父组件之前调用。。mounted
: 在绑定元素的父组件被挂载后调用。。beforeUpdate
: 在更新包含组件的 VNode 之前调用。。updated
: 在包含组件的 VNode 及其子组件的 VNode 更新后调用。beforeUnmount
: 当指令与在绑定元素父组件卸载之前时,只调用一次。unmounted
: 当指令与元素解除绑定且父组件已卸载时,只调用一次。
import { createApp } from 'vue'
const app = createApp({})
// 注册
app.directive('my-directive', {
// 指令是具有一组生命周期的钩子:
// 在绑定元素的 attribute 或事件监听器被应用之前调用
created() {},
// 在绑定元素的父组件挂载之前调用
beforeMount() {},
// 绑定元素的父组件被挂载时调用
mounted() {},
// 在包含组件的 VNode 更新之前调用
beforeUpdate() {},
// 在包含组件的 VNode 及其子组件的 VNode 更新之后调用
updated() {},
// 在绑定元素的父组件卸载之前调用
beforeUnmount() {},
// 卸载绑定元素的父组件时调用
unmounted() {}
})
// 注册 (功能指令)
app.directive('my-directive', () => {
// 这将被作为 `mounted` 和 `updated` 调用
})
// getter, 如果已注册,则返回指令定义
const myDirective = app.directive('my-directive')
路由
我们将 vue-router 加进来,然后配置组件和路由映射,再告诉 vue-router 在哪里渲染它们。
<div id="app">
<h1>Hello App!</h1>
<p>
<!--使用 router-link 组件进行导航 -->
<!--通过传递 `to` 来指定链接 -->
<!--`<router-link>` 将呈现一个带有正确 `href` 属性的 `<a>` 标签-->
<router-link to="/">Go to Home</router-link>
<router-link to="/about">Go to About</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
</div>
Ajax(axios)
Axios 是一个基于 Promise 的 HTTP 库,可以用在浏览器和 node.js 中
-
Get
axios.get('/user?ID=12345') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
-
Post
axios.post(url) .then(response => (this.info = response)) .catch(function (error) { // 请求失败处理 console.log(error); });
概念关系图
-
Vue3的请求生命周期
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~