[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.
Vue 是一种JS,HTML,CSS渲染框架,通过其独特的绑定渲染方式,使页面编程更加方便,容易(JS语法糖).
生态圈
- Vue Router
- Vuex
- Vue Loader
- Vue Test Utils
- Vue Dev-Tools
- Vue CLI
- Vetur
一, Hello word
1, 下载vuejs文件
1 | 地址: https://unpkg.com/vue@3.2.26/dist/vue.global.js |
2, 新建HTML页面, 引入vuejs文件
1 |
|
页面元素定义
1 | <div id="mainModuleId"> |
页面元素组件声明(js对象称之为vue组件)
1 | const HelloVueApp = { |
组件与元素使用vue绑定
1 | let vm = Vue.createApp(HelloVueApp).mount('#mainModuleId') // 绑定与渲染 |
二, 语法
1, 模板
1, 插入-文本
1 | 语法: { { * } } |
2, 插入-html
语法: <元素 v-html=”dataName”></元素>
1 | <div id="example1" class="demo"> |
3, 插入-属性(属性动态与页面空间绑定)
语法: v-bind:属性=””
1 | <button v-bind:disabled="isButtonDisabled">按钮</button> |
4, 插入-表达式
1 | <div id="app"> |
2, 指令
语法 属性 v-:(.修饰符)=”*”
3, 用户输入-反向设置
1 | <div id="app"> |
4, 缩写
1 | v-bind:href="ll" = :href="ll" |
二, 指令
控制显示
1, 是否显示该元素 v-if
1 | <p v-if="isShow">现在你看到我了</p> |
2, 是否显示该元素 v-else
1 | <div v-if="Math.random() > 0.5"> |
3, 是否显示该元素 v-else-if
1 | <div id="app"> |
4, 是否显示该元素 v-show
1 | <h1 v-show="ok">Hello!</h1> |
控制遍历
1, 循环数组显示多个 v-for
1 | <div id="app"> |
2, 循环数组显示多个 v-for 使用index
1 | <div id="app"> |
3, 循环数组显示多个 v-for 迭代对象
1 | <div id="app"> |
3, 循环数组显示多个 v-for 迭代整数
1 | <li v-for="n in 10"> |
4, 循环数组显示多个 v-for 迭代方法结果
1 | <div id="app"> |
5, 循环组件元素, v-for
1 | <div id="todo-list-example"> |
三 组件
1, 定义一个页面元素
1 | <div id="app"> |
2, js中创建vue应用
1 | const app = Vue.createApp({}); |
3, demo1: 组件控制元素事件
1 | <div id="app"> |
4, 组件与应用分离定义
1 | const comA = { |
5, 元素与组件数据传递,使用
1 | <div id="app"> |
6, 组件与组件数据传递,使用
1 | <div id="app"> |
7, 利用组件验证父组件对象
1 | Vue.component('my-component', { |
当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。
type 可以是下面原生构造器:
String
Number
Boolean
Array
Object
Date
Function
Symbol
type 也可以是一个自定义构造器,使用 instanceof 检测。
四 计算属性(对data中的属性值操作计算,并且返回值也作为data的属性(fn属性)存在)
1, demo1 利用computed反转字符串
1 | <div id="app"> |
2, demo2 利用methods反转字符串
1 | const app = { |
3, computed与methods有什么区别
- computed会缓存返回值
- methods不会缓存值
4, 给computed添加set方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26var vm = new Vue({
el: '#app',
data: {
name: 'Google',
url: 'http://www.google.com'
},
computed: {
site: {
// getter
get: function () {
return this.name + ' ' + this.url
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.name = names[0]
this.url = names[names.length - 1]
}
}
}
})
// 调用 setter, vm.name 和 vm.url 也会被对应更新
vm.site = '旺仔QQ糖';
document.write('name: ' + vm.name);
document.write('<br>');
document.write('url: ' + vm.url);五 监听(data属性变化)
另一种写法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<div id = "app">
<p style = "font-size:25px;">计数器: {{ counter }}</p>
<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>1
2
3
4
5
6
7
8
9
10
11
12const watchExampleVM = Vue.createApp({
data() {
return {
counter: ''
}
},
watch: {
counter(nval, oval) {// 两个参数分别为变化后, 变化前的值
alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');
}
}
}).mount('#watch-example')
六 class绑定
1, 定义元素
1 | <div ></div> |
2, 添加vue class
1 | <div :class="{ 'active': isActive }"></div> |
3, 添加点复杂运算
1 | <div id="app"> |
4, 原生class与vue class 共存自动合并, 且支持数组
1 | <div class="static" :class="[activeClass, errorClass]"></div> |
5, vue style
1 | <div :style="{ color: activeColor, fontSize: fontSize + 'px' }">Note</div> |
七 vue 事件处理
1, 写法: v-on:* 或@*
1 | v-on:click="methodName" |
2, 关联方法(methods)
1 | <button @click="greet">点我</button> |
八 表单(input, textarea, select, checkbox, radio等)指令
1, 指令 v-model
2, 数据元素双向绑定
1 | 文本 |
3, 原理
1 | v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件: |
4, 误区
1 | <!-- 错误 --> |
5, demo1 输入框,文本域
1 | <input v-model="message" placeholder="编辑我……"> |
6, demo2 复选框
1 | <p>单个复选框:</p> |
7, demo3 单选按钮
1 | <input type="radio" id="google" value="google" v-model="picked"> |
8, demo4 下拉列表-单选
1 | <select v-model="selected" name="fruit"> |
9, demo5 下拉列表-多选
1 | <select v-model="selected" name="fruit" multiple> |
10, demo6 下拉列表-动态选项
1 | <div id="app" class="demo"> |
11, demo7 值绑定(单选框,复选框,下拉框)
1 | 复选框, 选中时 vm.toggle='好学生' |
12, input数据处理工具
指令.lazy 更新数据在change事件中触发
1 | <input v-model.lazy="msg" > |
指令.number 接收转为number类型
1 | <input v-model.number="age" type="number"> |
指令.trim 自动过滤收尾空格
1 | <input v-model.trim="msg"> |
九 自定义指令
1, 自定义v-fff, 元素自动获取焦点
1 | <div id="app"> |
2, 自定义指令可绑定的触发逻辑(钩子)
1 | mounted: 在绑定元素的父组件被挂载后调用 |
1 | ============vue2->vue3的变化(参考: https://www.cnblogs.com/caijinghong/p/14368369.html) |
1 | import { createApp } from 'vue' |
3, 绑定触发逻辑参数
1 | el(第一个参数): 指令绑定到的元素,这可用于直接操作DOM |
4, 绑定简写默认绑定mounted
1 | <div id="app"> |
十 VUE路由(利用#缓存访问, 或利用H5新特性history)
1, 介绍
1 | 这个VUEJS插件提供一系列组件标签,提供路由的各种功能 |
2, 使用
步骤1: 下载或使用CDN或NPM安装
1 | https://unpkg.com/vue-router@4 |
npm安装
1 | npm install -g cnpm --registry=https://registry.npmmirror.com |
步骤2: 使用,举个例子
1 | <script src="https://unpkg.com/vue@3"></script> |
1 | // 1. 定义路由组件. |
3, router-link标签的属性
to: 表示目标路由的链接, 当点击后调用router.push(to值),to值可以是一个字符串或者是描述目标位置的对象
1 | <!-- 字符串 --> |
replace: 当添加了replace属性, 点击时会调用router.replace(to值)而不是router.push(to值),导航后不会留下history记录
1 | <router-link :to="{ path: '/abc'}" replace></router-link> |
append: 表示是否附加在当前路径后,仅to值是相对路径时生效 例如:当前路径/base, to路径value(/value不生效), 添加后跳转路径为/base/value,而不是/value
1 | <router-link :to="{ path: 'value'}" append></router-link> |
tag: 渲染成指定的标签,相当于包括了router-view功能
1 | <router-link to="/foo" tag="li">foo</router-link> |
active-class: 设置激活时添加的class名, 匹配方式为前匹配
1 | <style> |
exact-active-class: 功能同上, 匹配方式为精确匹配
event: 配置用啦触发导航的事件, 可以是一个字符串或是一个包含字符串的数组
1 | <router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link> |
十一 对象自动合并(mixins)
略
十二 Ajax(依赖axios第三方包)
1 | Vue 版本推荐使用 axios 来完成 ajax 请求。 |
1, 安装axios(下载|CDN|npm|其他)
CDN
1 | <script src="https://unpkg.com/axios/dist/axios.min.js"></script> |
NPM
1 | $ npm install axios |
bower
1 | $ bower install axios |
yarn
1 | $ yarn add axios |
2, 使用axios发起请求
1 | 第一种 |
3, Vue使用axios-GET
1 | <div id="app"> |
添加params
1 | // 直接在 URL 上添加参数 ID=12345 |
4, Vue使用axios-POST
1 | axios.post('/user', { |
5, axios其他API
1 | axios.request(config) |
6, 并发多个执行 API
1 | axios.all(iterable) |
7, 自定义axios
A, 创建axios实例, 配置参数
1 | const instance = axios.create({ |
B, 利用实例创建请求
1 | axios.get('/user/12345'); |
config可配置值
1 | { |
C 接收响应
1 | axios.get("/user/12345") |
response响应格式
1 | { |
8, axios默认值
1 | 'https://api.example.com'; = |
修改默认值
1 | // 创建实例时设置配置的默认值 |
配置优先顺序(1<2<3)
1, lib/defaults.js默认值配置
2, defaults属性配置
3, config入参
9, 拦截器
添加拦截器
1 | // 添加请求拦截器 |
删除拦截器
1 | var myInterceptor = axios.interceptors.request.use(function () {/*...*/}); |
异常处理
1 | axios.get('/user/12345') |
十, 请求格式
A, 默认(axios中lib默认配置不是这个,但是默认却用这个, 挺奇怪)
application/json;charset=utf-8
B, 使用application/x-www-form-urlencoded
const params = new URLSearchParams();
params.append(‘param1’, ‘value1’);
params.append(‘param2’, ‘value2’);
axios.post(‘/foo’, params);