Vue基本使用
- 输入框
- 事件处理
- 组件
通讯:
自定义事件通讯的销毁
v-model,$emit update
sync
- vuex
state
mutations
action
getter
commit
dispatch
mapState
mapActions
mapGetters
mapMutations
- vue-router
- axios
- 插槽
Vue高级特性
- 自定义model
- $nextTick
Vue是异步渲染的
data改变之后,Dom不会立刻渲染
$nextTick会在Dom渲染之后出发,以回去最新Dom节点
- slot
- 动态、异步组件
- keep-alive
-
路由
路由的模式
hash
- history
hash
```javascript
// 监听路由变化
window.addEventListener(“hashchange”, function () {
});
// 监听路由变化 window.onhashchange = function (event) {
}
<a name="C4UBv"></a>### history<br />需要服务器配置```javascripthistory.pushState({{name: 'pageName'}, '', 'pageName'});// 监听浏览器前进后退window.onpopstate = function (event) {console.log(event.state);}
Vue原理
组件化
响应式
模板编译
vdom
组件化
响应式
- 对象
Object.defineProperty
缺点:
递归监听
不能对数组做监听
不能监听属性的新增和删除 Vue.$set, Vue.$delete
数组
重写原型
Diff算法
模板编译
渲染过程
异步渲染
render函数会出发getter
更新过程
自动加载
一般写法
import Vue from 'vue';import Router from 'vue-router';const Home = resolve => {require.ensure(['@/views/Home'], () => {resolve(require('@/views/Home'))}, 'Home')}const About = resolve => {require.ensure(['@/views/About'], () => {resolve(require('@/views/About'))}, 'About')}let routes = [{path: '/',name: 'Home',component: Home,}, {path: '/About',name: 'About',component: About,}];Vue.use(Router);export default new Router({routes});
当我们的项目变得庞大,页面变多的时候,维护页面的路由也将会变得繁琐,
那就可以考虑去实现路由的自动加载
路由自动加载
- 思路
我们可以将用到的页面都引入,然后通过文件名去筛选拿到路由名称
可以通过webpack的api来获取对应的文件,即上下文来实现。
require.context();
可以给这个函数传入三个参数:一个要搜索的目录,一个标记表示是否还搜索其子目录, 以及一个匹配文件的正则表达式。
require.context(directory, useSubdirectories = false, regExp = /^\.\//);// require.context(// directory: String, 要搜索的文件夹目录// includeSubdirs: Boolean /* optional, default true */, 搜索它的子目录// filter: RegExp /* optional, default /^\.\/.*$/, any file */, 匹配文件的正则表达式// mode: String /* optional, 'sync' | 'eager' | 'weak' | 'lazy' | 'lazy-once', default 'sync' */// )
- 实现
import Vue from 'vue';import Router from 'vue-router';// 先定义一个空的路由数组let routes = [];let views = require.context('../views/', true, /\.vue$/);// 导出的方法有 3 个属性: resolve, keys, id。// - resolve 是一个函数,它返回请求被解析后得到的模块 id。// - keys 也是一个函数,它返回一个数组,由所有可能被上下文模块处理的请求组成。// - id 是上下文模块里面所包含的模块 id. 它可能在你使用 module.hot.accept 的时候被用到// 这里只用到 keys,返回搜索到的数组views.keys().forEach((key) => {let routerName = views(key).default.name;// 将对应路由push到路由的数组routes.push({path: routerName === 'Home' ? '/' : `/${routerName}`,title: routerName,name: routerName,component: views(key).default});});// console.log(routes);Vue.use(Router);export default new Router({routes});
组件的自动加载
同理,我们也可以通过该api实现组件的自动加载
- 在组件文件夹下新建
index.js,编码如下
const files = require.context('./', false, /\.vue$/); //引入当前路径下所有的vue组件let components = {};files.keys().forEach((key) => {components[files(key).default.name] = files(key).default;});console.log(components);export default components;
- 在需要用到组件的地方
import subComponents from '/components';component: {subComponent}
