vue-cli+webpack如何创建一个vue架子
webpack:https://blog.csdn.net/Crazy_GirlLL/article/details/114657663
https://www.jianshu.com/p/216ed82a3e49
vue2和vue3 的区别
vue.set
vue.set修改数组,因为vue对数组内部改变不敏感,所以,使用其对数组进行修改
vue.set(要改变的数组,要改变的数组的下标,新值)===》vue.set(this.arr,0,2)
vue.set不仅可以修改数组中的某项,还可以用来增加
动态路由:
vue-router的scrollBehavior:切换组件时,页面不从顶部开始,从上个页面浏览的位置开始的情况
const router = new Router({
scrollBehavior(to, from, savedPosition) {
if (savedPosition && to.meta.keepAlive) {
return savedPosition;
}
return { x: 0, y:0 };
},
});
————————————————
原文链接:https://blog.csdn.net/q3254421/article/details/84777614
MVVM,MCV模块化设计模式和开发流程:
**前后端不分离**的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前后端的耦合度很高
这种应用模式,比较适合纯网页应用,但是当后端对接APP时,APP可能并不需要后端返回一个HTML网页,而仅仅是数据本身,所以后端原本返回网页的接口,不再适用于前端APP应用,为了对接APP还要再开发一套接口
**前后端分离**是一种开发模式,前端负责将数据按照产品设计渲染以及调用后端接口,实现产品功能,而后端则提供数据接口,功能接口,前后端分离的开发模式是为了让专业的人做专业的事,且现在前端和后端可以通过接口文档实现并行开发,提高开发效率
**MVVM定义**:MVVM是Model-View-ViewModel的简写,即**模型-视图-视图模型**。【模型】是指后端传递的数据。【视图】是指所看到的页面。【视图模型】是mvvm模式的核心,他是连接view和model的桥梁。他有**两个方向**,一是将【模型】转化成【视图】,即后端传递的数据转化成所看到的页面,**实现方式**:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。**实现方式**:DOM事件监听。这两个方向都实现的,我们称之为数据的双向绑定
总结:在MVVM的框架下,视图和模型是不能直接通信的,他们通过ViewModel来通信,viewModel通常要是想一个observer观察者,当数据发生变化,viewModel能够监听到数据的变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知到对应的数据做改动,这实际上就实现了数据的双向绑定,而且MVVM中的view和ViewModel也可以相互通信。
**MVC定义**:MVC是Model-View-Controller的缩写。即模型-视图-控制器,m和v和上述意思一样,c即Controller值得就是页面业务逻辑,使用**MVC的目的就是将M和V代码分离**,MVC是单向通信,也就是View和Model,必须通过Controller来承上启下
详见:https://baijiahao.baidu.com/s?id=1596277899370862119&wfr=spider&for=pc
双向绑定的原理
vue最独特的特性之一,是其非侵入性的响应式系统,数据模型仅仅是普通的JavaScript对象,而当你修改他们时,视图会进行更新,这使得状态管理非常简单直接
当数据变化后,会重新对页面渲染,这就是vue的响应式
完成这一过程需要:
1, 检测数据的变化
- 在JavaScript中,使用`Object.definePeoperty`和`Proxy`来检测一个数据的变化,这就是数据劫持或者数据代理
- 前者不支持数组的长度变化,即无法检测到对象属性的添加或删除 ,不能监听数组的变化,需要进行数组方法的重写,若修改数组中的第一个元素,也无法检测数组的变化
- 第二种的兼容性并不好
2,收集视图依赖了哪些数据
- 我们只有通过收集依赖才能知道哪些地方依赖我的数据,以及数据更新时派发更新
- 数据变化时,自动“通知”需要更新的视图部分,并进行更新(发布订阅模式)
- 收集依赖需要为依赖找一个存储依赖的地方,为此我们创建了Dep,它用来收集依赖,删除依赖和向依赖发送消息等,具体点也就是用来存放Watcher观察者对象,我们可以把Watcher理解成一个中介的角色,数据发生变化时通知它,然后他再通知其他地方,
**总结**:
虚拟dom:
传统的开发模式,原生js或者JQ操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程,在一次操作中,我需要更新10个DOM节点, 浏览器收到第一个DOM请求后并不知道还有9次更新操作,因此会马上执行,最终执行10次。
例如,再一次计算完,紧接着下一个DOM更新请求,这个接二店的坐标值就变了,前一次的计算为无用功,如此频繁的操作就有可能出现页面卡顿,影响用户体验
为什么需要虚拟DOM,它有什么好处?
虚拟DOM就是为了解决浏览器性能问题而被设计出来的,如上,若操作一次中有10次更新DOM的操作,虚拟DOM不会立即操作DOM,而是将这10次更新的内容保存到本地的一个js对象中,最终将这个js对象一次性的给到DOM树,再进行后续操作,避免大量无谓的计算量。
所以,用js对象模拟DOM节点的好处是,页面的更新可以先全部反映在JS对象(虚拟DOM)上,操作内存中的JS对象的速度显然要更快,等更新完成之后,再讲最终的js对象映射成真是的DOM ,交由浏览器去绘制
链接:https://www.jianshu.com/p/af0b398602bc
NPM 模块安装机制:
- 发出npm install命令
- 查询node_modules目录之中是否已经存在指定模块
- 若存在,不再重新安装
- 若不存在
传值方式
路由中hash和history的区别:
生命周期函数:
业务场景
params和query的区别:
vuex的使用:
定义:vuex是一个专门为vue.js应用程序开发的状态管理模式,集中存储应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
state | mutations | actions | getters | mapState | mapGetters | mapActions | |
作用 | 用来存储全局访问的变量 | 用来修改state里面的数据 | 和mutations一样,用来修改state里面的数据,但这里是异步操作,而且不能直接修改,需要提交到mutations里面让其修改:this.$store.commit('fn'); | 和组件中的computed类似,对state里面数据的二次加工 | 也是获取方法,使用数据,只是 和前面不同,不需要使用this.$store.state.val来调用;
|
同mapState | |
使用方法 | this.$store.state.变量 | this.$store.commit('fn',val); fn为mutations里面的函数 |
this.$store.dispatch('fn',val); fn为actions里面的函数 |
this.$store.getters.fn fn为getters里面的函数 |
...mapState({ count1:state=>state.count})
...mapGetters({ count1:state=>state.count}) |
至于module的话,感兴趣可以去vuex官网看,也就是当数据多的时候,划分了多个模块,便于编写代码
详情:https://blog.csdn.net/Crazy_GirlLL/article/details/114699180
vuex中保存的东西,刷新之后就没了咋办?
插件vuex-persistedstate:https://blog.csdn.net/Crazy_GirlLL/article/details/114700410
公共导出方法,创建a标签的方法?
import axios from "axios";
import fileDownload from "js-file-download";
import { getStore } from "./storage";
import $ from "jquery";
export async function download(url, params, name) {
const res = await axios({
// baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API : '/',
timeout: 2 * 60 * 60 * 1000,
headers: { Authorization: "Bearer " + getStore("MyToken") },
url: url,
method: "get",
params: params,
responseType: "blob"
});
// const disposition = res.headers["content-disposition"];
// const temp = disposition.split(";")[1].split("filename=")[1];
// 强制转码
const iconv = require("iconv-lite");
iconv.skipDecodeWarning = true; // 忽略警告
// const filename = iconv.decode(temp, 'UTF-8')
const filename = name;
// const fileType = res.headers["content-type"];
const resBlob = res;
let resData = null;
try {
const resText = await new Promise((resolve, reject) => {
// 通过 FileReader 接受并解析
const reader = new FileReader();
reader.addEventListener("abort", reject);
reader.addEventListener("error", reject);
reader.addEventListener("loadend", () => {
resolve(reader.result);
});
// 文件
reader.readAsText(resBlob);
});
resData = JSON.parse(resText);
} catch (err) {}
if (resData) {
if (resData.error) {
} else {
}
} else {
fileDownload(resBlob, filename);
}
}
nexttick实现原理
实现原理:nextTick方法主要是使用了宏任务和微任务,定义了一个异步方法,先后对promise,mutationObserver,setImmediate,setTImeout的存在进行判断,在每次的事件循环的最后,都会有一个UI render ,也就是更新dom,所以,把nexttick的代码放在UI render步骤后面执行,就能访问到更新后的DOM
MutationObserver:H5新增的API,用来监视DOM变动的接口,可以监听一个DOM对象上发生的子节点删除,属性修改,文本内容修改等
调用优先级:Promise > MutationObserver > setImmediate > setTimeout
1,因为js执行是单线程的,它是基于事件循环的
由于vue DOM更新是异步执行的,即修改数据时,视图不会立即更新,而是会监听数据变化,并缓存在同一事件循环中,等同一数据循环中的所有数据变化完成之后,在同一进行视图更新,(也就是虚拟dom的作用),为了确保得到更新后的DOM,所以有了vue.nextTick()
事件循环:分为宏任务和微任务。由于宏任务耗费的时间是大于微任务的,所以在浏览器支持的情况下,优先使用微任务。如果浏览器不支持微任务,再使用宏任务
宏任务主要包含:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 环境)
微任务主要包含:Promise、MutaionObserver、process.nextTick(Node.js 环境)
https://blog.csdn.net/Crazy_GirlLL/article/details/114872356
任务列队:分为同步任务和异步任务;所有同步任务执行完成之后,按照优先级顺序,执行任务列队中的异步任务
vue的特性:
用到过什么UI框架,优缺点,
Ant Design 在 标准、视觉 上更胜一筹,但是 ant-design-vue 相对比较年轻,成熟度上差 Element Ui 一些。
Element-UI 是国内做 Vue 最早,也最成熟的一家。用户群体多,遇到问题基本都能解决
vant:一般用与移动端
vxe-table:表格的各种需求,表尾合计
vue项目APP,首次加载很慢?
VUE项目强制刷新
需要强制刷新的页面
axios原理
axios可以用在浏览器和 node.js 中是因为,它会自动判断当前环境是什么,如果是浏览器,就会基于XMLHttpRequests实现axios。如果是node.js环境,就会基于node内置核心模块http实现axios
axios的特点有哪些?
答:
一、Axios 是一个基于 promise 的 HTTP 库,支持promise所有的API
二、它可以拦截请求和响应
三、它可以转换请求数据和响应数据,并对响应回来的内容自动转换成 JSON类型的数据
四、安全性更高,客户端支持防御 XSRF
axios有哪些常用方法?
答:
一、axios.get(url[, config]) //get请求用于列表和信息查询
二、axios.delete(url[, config]) //删除
三、axios.post(url[, data[, config]]) //post请求用于信息的添加
四、axios.put(url[, data[, config]]) //更新操作
说下你了解的axios相关配置属性?
答:url
是用于请求的服务器URL
method
是创建请求时使用的方法,默认是get
baseURL
将自动加在url
前面,除非url
是一个绝对URL。它可以通过设置一个baseURL
便于为axios实例的方法传递相对URL
transformRequest
允许在向服务器发送前,修改请求数据,只能用在'PUT','POST'和'PATCH'这几个请求方法
headers
是即将被发送的自定义请求头
headers:{'X-Requested-With':'XMLHttpRequest'},
params
是即将与请求一起发送的URL参数,必须是一个无格式对象(plainobject)或URLSearchParams对象
params:{
ID:12345
},
auth
表示应该使用HTTP基础验证,并提供凭据
这将设置一个Authorization
头,覆写掉现有的任意使用headers
设置的自定义Authorization
头
auth:{
username:'janedoe',
password:'s00pers3cret'
},
'proxy'定义代理服务器的主机名称和端口auth
表示HTTP基础验证应当用于连接代理,并提供凭据
这将会设置一个Proxy-Authorization
头,覆写掉已有的通过使用header
设置的自定义Proxy-Authorization
头。
proxy:{
host:'127.0.0.1',
port:9000,
auth::{
username:'mikeymike',
password:'rapunz3l'
}
},
链接:https://www.jianshu.com/p/73f6362889c8
v-for,v-if优先级
v-for的优先级比较高,但是不推荐用在一起,这样比较消耗性能
每次都要先循环,循环完之后,在每个item里面都要去进行v-if判断,数据量大的话就会很消耗性能
v-show,v-if区别
v-show:是根据css中的display:none / block来去显示的,不管为none还是block都会渲染,所以适用于切换操作
v-if:是根据在DOM树上增加或删除元素来实现的,如果为false则不存在该元素 ,如果为true则在DOM树上添加该元素,所以适用于初始化渲染后不会变动的元素,比如权限
$route,$router区别
$route:当前跳转的路由信息对象。里面有params,query,name,path之类的属性
$router:是全局的路由实例对象,里面包所有的路由,还有一些方法和属性,push,history,
data为什么不是个对象而是一个函数
组件是可复用的vue实例,一个组件被创建好之后,就可能被用在各个地方,而组件不管被复用了多少次,组件中的data数据都应该是相互隔离的,互不影响的,基于这一理念,组件每复用一次,data数据就应该被复制一次,当某一处复用的地方组件内的data数据被改变时,其他复用地方组件的data数据不受影响
如果data是一个对象的话,就使得所有组件中组件实例共用了一份data,就会变成一个变了全部都会变的结果
ssl服务器渲染
浏览器端渲染,指的是用 JS 去生成 HTML,例如 React, Vue 等前端框架做的路由。
服务器端渲染,指的是用后台语言通过一些模版引擎生成 HTML,例如 Java 配合 VM 模版引擎、NodeJS配合 Jade 等,将数据与视图整理输出为完整的 HTML 文档发送给浏览器。
用过nuxt.js