第一章 初入vue
基于vue2
之前是用的原生js+css+html写代码,顶多再用个jQuery,想发送请求用js原生xml,要不就是利用jQuery的ajax等第三方。写法是一个页面一个HTML文件,每一个页面引入自己需要的js、css、第三方库等。页面之间的跳转大多用的是window.location.href = '/XXXX.html'。这种模式叫MVC模式。
01 初始vue
vue代码的写法和之前是迥然不同的。最大的特点是只有一个页面。利用数据驱动视图(MVVM),双向绑定。 开发方式是利用vue脚手架工程化开发。它的作用是可以使开发效率提高,可以处理更加复杂的业务逻辑,更好的拥抱未来。
02 vue的由来
vue是渐进式javascript框架 。根据vue的特点,列出他的原理,这篇文章就不写了,有兴趣可以去百度Vue源码系列-Vue中文社区
变化侦测篇
学习Vue中如何实现数据的响应式系统,从而达到数据驱动视图。
虚拟 DOM 篇
学习什么是虚拟 DOM,以及Vue中的DOM-Diff原理
模板编译篇
学习Vue内部是怎么把template模板编译成虚拟DOM,从而渲染出真实DOM
实例方法篇
学习Vue中所有实例方法(即所有以$开头的方法)的实现原理
全局 API 篇
学习Vue中所有全局API的实现原理
生命周期篇
学习Vue中组件的生命周期实现原理
指令篇
学习Vue中所有指令的实现原理
过滤器篇
学习Vue中所有过滤器的实现原理
内置组件篇
学习Vue中内置组件的实现原理
03 使用vue怎么开发?
之前我开发项目是那么写,现在用vue到底该怎么做才能和之前开发出一样的效果,甚至比之前更好呢?
第二章 vue这个工具的使用
正所谓。知己知彼,我得先知道vue是怎么用才可以谈怎么做项目,下面会将vue功能进行分类 。
01 插值表达式|胡子语法
里面可以写一写简单逻辑 语法{{ }}
02 指令
03过滤器
是什么: 转换格式, 过滤器就是一个函数, 传入值返回处理后的值
使用:
- Vue.filter("过滤器名", (值) => {return "返回处理后的值"}) =》全局写在main.js中最好,全局组件都可以用
- filters: {过滤器名字: (值) => {return "返回处理后的值"}=》局部
- 模板中使用
import Vue from "vue"; Vue.filter("toUp", (val) => { // 2. 全局过滤器: 到处使用=>全局注册在main.js中注册, 一处注册到处使用 return val.toUpperCase(); });
04 计算属性computed
一个数据, 依赖另外一些数据计算而来的结果
其实也是变量,只不过是对变量计算后的变量,可以v-for计算属性名
简写 (只可读):
语法:computed: { "计算属性变量名" () { return "值" } }
完整写法(可读写):
computed: { "属性名": { set(值){ }, get() { return "值" } } }
计算属性也是vue数据变量, 所以不要和data里重名, 用法和data相同
注意:上面的是简写,只能读,不可以修改。完整写法可以读写
应用:如计算总价和均价
04-1 监听属性-watch
可以监听data/computed等属性值改变
用法:
watch: { "被监听的属性名" (newVal, oldVal){ 当变量的值发生改变就会触发这里的函数,然后做事 } }
05.组件
一个页面, 可以拆分成一个个组件,一个组件就是一个整体, 每个组件可以有自己独立的 结构 样式 和 行为(html, css和js)
封装的思想,把页面上
可重用的部分
封装为组件
,从而方便项目的 开发 和 维护
使用:全局:
import 组件对象 from 'vue文件路径'
Vue.component("组件名", 组件对象)
在任何组件中只要写入<组件名>组件名>就可以使用组件
局部:1.引入 2 components里注册 3 使用<组件名 />
注意点:1. scoped作用解决多个组件样式名相同, 冲突问题 类似于函数作用域
2./deep/深度作用选择符 父组件控制子组件的样式(style都加了scoped属性情况)
06组件通信
遵循单向数据流:父变子变,子不可直接改父,可通过修改引用地址方式改父
因为每个组件的变量和值都是独立的, 如果想获取对方页面中定义的变量应该怎么做?
1.父传子 父:在<子的组件名>上使用 :自定义的名字 子:props接收
2子传父 父: @自定义事件名="父methods函数" 子: this.$emit("自定义事件名", 传值)
3. 事件总线跨组件:1.定义
// 1. 创建事件总线 main.js const bus = new Vue() // 把bus挂载到了Vue的原型上, 保证所有的组件都能通过 this.$bus访问到事件总线 Vue.prototype.$bus = bus
2 页面使用
// 2. 订阅事件 - 接收值 要接收的 this.$bus.$on('事件名', 事件回调函数) this.$bus.$on('send', msg => { }) // 1. 在created中订阅 // 2. 回调函数需要写成箭头函数 // 3. 发布事件 - 传递值 要往外传 this.$bus.$emit('事件名', 额外参数) this.$bus.$emit('send', 'hello')
07 生命周期
定义: 一个组件从 创建 到 销毁 的整个过程就是生命周期
作用:在特定的时间,执行某些特定的操作
<template> <div> <ul id="myUl"> <li v-for="(item, ind) in arr" :key="ind">{{ item }}</li> </ul> <button @click=" () => { arr.push(Math.random() * 10); } " > 增加一个元素 </button> </div> </template> <script> export default { data () { return { msg: "我是变量", arr: [1, 2, 3, 4], isShow: true, } }, beforeCreate () { // 1. 创建前 console.log("beforeCreate --- 实例初始化前") console.log(this.msg) // undefined }, created () { // 2. 创建后=> 发送ajax请求 console.log("created --- 实例初始化后") console.log(this.msg) // "我是变量" }, beforeMount () { // 3. 挂载前 console.log("beforeMount --- vue的虚拟DOM, 挂载到真实的网页之前") console.log(document.getElementById("myUl")) // null // console.log(document.getElementById("myUl").children[1].innerHTML) // 报错 }, mounted () { // 4. 挂载后=》操作dom console.log("mounted --- vue的虚拟DOM, 挂载到真实的网页上 ") // console.log(document.getElementById("myUl").children[1].innerHTML) console.log(document.querySelector('#myUl').children[1].innerText) }, beforeUpdate () { // 5. 更新前 console.log("beforeUpdate --- 数据更新, 页面更新前") // 比如点击新增数组元素, vue会触发此生命周期函数, 但是此时页面并未更新, 所以获取不到新增的li标签 // console.log(document.getElementById("myUl").children[4].innerHTML) // 报错 }, updated () { // 6. 更新后 console.log("updated --- 数据更新, 页面更新后") console.log(document.getElementById("myUl").children[4].innerHTML) }, beforeDestroy () { // 7. 销毁前 // (清除定时器 / 解绑js定义的事件) console.log("beforeDestroy --- 实例销毁之前调用") }, destroyed () { // 8. 销毁后 // (清除定时器 / 解绑js定义的事件) console.log("destroyed --- 销毁完成") }, }; </script> <style> </style>
我的理解: 创建后,也就是create钩子函数的时候,已经有数据了(实例对象data),但是没有挂载(el)第三个狗子,beforemount 已经有虚拟DOM了,但是没渲染,直到mount第四钩子函数才渲染了,销毁前这个钩子,dom还在,解除事件和dom绑定,销毁这个钩子DOM才销毁。注意:第一次页面加载,会触发前面4 个钩子函数,DOM渲染在第四步,最早发起ajax在create 钩子函数里
08 axios
是什么: 是一个专门用于发送ajax请求的库。底层还是原生js实现,内部通过promise封装的
使用: 里面的then 是一个异步,微任务
// 1. 导入axios import axios from 'axios' // 2. 使用 axios({ method: '请求方式', // get post url: '请求地址', data: { // 拼接到请求体的参数, post请求的参数 xxx: xxx, }, params: { // 拼接到请求url的参数, get请求的参数 xxx: xxx } }).then(res => { console.log(res.data) // 后台返回的结果 }).catch(err => { console.log(err) // 后台报错返回 })
实际工作中,会对axios进行封装。因为用的比较频繁。 具体封装新开一帖。