二十三 Vue2.5实战模版语法组件化
vue创建项目提示脚本错误: https://blog.csdn.net/qq_45164496/article/details/102170303
new Vue({}) // vue的入口,, 顶级的父元素 Vew.component() // 新建全局组件,不用import export default{} // 单文件组件对外暴露的内容
1 |
|
二十四 Vue2.5实战UI组件库 定制组件
- form form-item input组件的定制
- props既可以是数组,也可以是对象: 猜测应该是通过获取属性时调用方式是一样的吧, props属性为单值时用数组,props属性为对象时,props用对象
- provide既可以是函数,也可以是对象: 猜测函数时相当于同名字段属性(应该就是get属性吧,注意不是方法,方法都放在method中),要有返回值return 一个对象
- props传递的数据不能修改,需要赋值给组件中的变量,然后是修改使用
- 单向数据流: 通过props传递的值,得通过父元素修改,再传给自己
- 自定义组件 实现v-model 需要实现两方面 , 组件中接受value, 组件修改值后派发input事件,修改传递的外部value ,, 具体看 k-input的实现
1 | * 实现v-model: |
provide inject 和props 对比
1
2
3
4
5provide(){
return {
form: this // 给子级提供form实例 ,子级注入使用form实例; 体会provide inject和props的区别 , provide inject封装在组件内部,是一般底层开发控件时用到的,开发用到所以必须得提供给下级,而props是在外部,使用该控件时可选择性的输入属性,一个是开发必须,”偷偷摸摸“,一个是可选择,正大光明;一个面向底层实现,一个面向用户使用;; 如果是强制用props开发,会造成用户使用时得强制传入一个固定的输入属性,用于底层的实现,,这样用户体验不好,能底层默认实现的,就直接提供注入就好了
}
}
二十五 Vue2.5实战 Vuex单向数据流 Vue-router单页应用
单页应用: spa 路由的控制权在前端
路由哈希模式/history模式:
哈希: http://localhost:8080/#/page1 不利于seo, 认为是一个页面 , 因为 # 一般用于页面内部跳转
history:http://localhost:8080/page1
Use history mode for router? (Requires proper server setup for index fallback in production)
history部署时要和后台 index ??? todo ,, vue是前台控制路由,打包后只有一个index文件作为路口
查看源码:比如 view-source:http://localhost:8080/dashboard/page1 ,发现无论哪个路由都是这一个文件,后台需要根据这个文件配置;;
routerLink和href
routerLink 会局部刷新,只刷新目标路由页面,url里不会刷新
href 会刷新整个页面,url会刷新,重新加载整个页面
1
2
3
4
5
6<div>
<router-link to="/page1">页面1</router-link>|
<router-link to="/page2">页面2</router-link>|
<a href="/page1">href页面1</a>|
<a href="/page2">href页面2</a>
</div>
路由异步加载: 打包时不经常访问的路由可以使用异步路由,打包的文件则不包含异步路由, 异步路由是在点击时异步加载;; 清除缓存,点击其他路由时不会有请求,因为一开始都加载了(第一次加载首页也有0.js啊?),, ,第一次点击登录时会加载0.js;;;;; 和require , script标签加载js 原理一致 .. ??
- 数据处理: props(层层传递) ; provide/inject(子孙共享); this.$emit(组件内部派发,外部使用组件处事件监听); this.$bus.emit/on (组件间进行通信); vuex: 数据管理中心(storage/stage/mutation)
vue使用插件use, vue-router属于插件级别 ; vuex也是插件
import VueRouter from ‘vue-router’ // 不加/ 是node_modules
// use启用插件
Vue.use(VueRouter); //this.$route use将$route挂载到了Vue原型上
形参使用解构赋值
1
2
3
4
5
6
7
8
9
10actions: { // 异步的mutations 数据的修改还是要调用mutations修改
// incrementAsync(store) {
// store.commit('increment');
// }
incrementAsync({commit}){ // 传参时可以形参可以直接解构出对应的变量
commit('increment')
}
}
注: 给incrementAsync传递参数为store对象,可以用一个形参store接收, 也可以用{commit}接收,,意思是实参是store对象,而执行的函数只要store对象中的commit,, 这样些要求store对象中有响应属性, 形参可以直接解构得到,, 使用时省些步骤import/require 引入的文件, 如何调试
import Vuex from ‘vuex’ // es6 用import
//const Vuex = require(‘vuex’); // 两者写法等价吗, 用require方式也正常执行,, es6之前和node用require, node为什么不用import?
以 vuex mapState为例, 找到vuex,package.json中, 有一个main和moudle对应了两个脚本, 在这两个脚本的开头alert 一下,发现用的是esm.js , 因此想要调试的话找到方法console就行了,但是如何一步一步调试还不清楚。
另外想调试mapState 转到定义到了 helpers.d.ts中,而实际mapState函数在esm.js中,, 待研究
二十六 电商项目实战
ui框架:移动端/web端 选型;;; vue: cube element
bootstrap过时,基于jquery,class方式使用,不是写标签;;; 响应式针对移动端,,,一般pc和移动要写两套代码
ui框架的使用: 先安装, 看文档快速上手, 在webpack中做配置(按需加载,自定义主题)
启动项目编译报错 –fix; 在package.json中添加
1
2
3
4
5"rules": {
"indent": [1, 4]
},
// 不行 还是会报错 , 把package.json中的 "@vue/standard" 干掉axios添加到全局
//main.js入口文件中添加到Vue原型之上 import axios from 'axios' Vue.prototype.$axios = axios 其他组件中使用: this.$axios
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
26
27
28
29
30
31
- 基本的权限校验: 路由守卫+**拦截器**
- **拦截器**: 比如给所有的请求头加上token,所有响应返回处理之前根据状态码进行全局处理(比如: axios的响应结果是http对象,不单单是数据,包含了响应的各种参数,全局设置一个拦截器, 只将符合要求的data返回即可)
- token
- cookie有同源策略的限制,token没有,但需要自己处理实现
# 二十七 电商项目实战
- cube-ui 异步校验
```js
rules:{ // 校验规则
required: true,
type: 'string', //对应的自定义校验信息写在messages,,
min: 3,
max: 15,
// 自定义异步校验: 校验登录用户名是否存在
// 异步校验的规则: 函数,接收一个resolve参数, 或者是一个promise
// 意义: 就是返回给控件一个异步校验的函数,将异步校验的函数resolve出去即可,控件会调用异步校验函数,并得到校验结果,写入相关校验信息
usercheck:(name)=>{
return (resolve)=>{ // 带上new Promise 也可以,这样更省事
//resolve(false); // 会一直不存在,这是同步校验
this.$axios.get('/api/check?username='+name).then(res=>{
resolve(res.code==0) ; // 0为true/为校验通过
})
}
}
},this.$router 路由器 负责路由的跳转,,this.$route 路由 获取当前路由信息
父组件直接使用子组件整个实例: ref
stylus css用法 ; scoped
二十八 电商项目实战
- header组件: 定位样式 props / slot
- v-if v-show hidden
- 阻止冒泡和默认事件 stop prevent 直接写在事件名中 @click.stop.prevent=”addCart($event,item)”
- 事件对象的传递 $event $event.target为dom对象
组件封装
- https://segmentfault.com/a/1190000018926846
- https://juejin.im/post/5cb3eed65188251b0351f2c4?utm_source=gold_browser_extension#heading-10
文件调试
报个错,然后定位到相关文件,加断点
在webpack://下找 ./src , 加断点
el 和 mount 挂载组件区别
- 自定义消息提示中 将Notice.vue挂载到了body上,先$mount(),然后再原生append
1 | 两者在使用效果上没有任何区别,都是为了将实例化后的vue挂载到指定的dom元素中。 |
二十九 VUE源码
createDocumentFragment() 用法: https://blog.csdn.net/qiao13633426513/article/details/80243058,
源码简单实现见代码