webpack优点
- 模块来源广泛,支持包括npm/bower等等的各种主流模块安装/依赖解决方案
- 模块规范支持全面,amd/cmd以及shimming等一应具全
- 浏览器端足迹小,移动端友好,却对热加载乃至热替换有很好的支持
- 插件机制完善,实现同样模块化,容易扩展
vue使用中
- 有两种方式: 单文件的方式,.vue结尾的文件-> 基于webpack来编译使用
- 引包的方式: 双向数据绑定(企业应用较少)
webpack基本操作
- 下载安装
- 全局命令行工具
npm i -g webpack
- 默认支持commonjs模块定义
- 运行方式通过指定命令
- webpack 入口文件 目标文件
webpack ./index.js ./build.js
- 通过配置文件,以代码的形式来指定webpack运行的相关设置
使用webpack配置文件
- 进入到当前有webpack.config.js 文件的目录下,运行命令行webpack
module.exports =
{
//入口在那咯
entry: {
main: './index.js', //单文件入口
},
output: {
filename: './build.js'
}
//出口文件
}
引入css问题
- 原理:通过解析css代码,最终将css作为js中动态生成style标签,并插入到文档中
- 解析css,还需要依赖style-loader
- 安装:
npm i css-loader style-loader -D
- 进行配置: 配置到module属性中,其属性是一个个的对象
module: { //模块
loaders: [ //一个loader对象
{
test: /.css$/, //只有以.css结尾的文件我才操作
loader: 'style-loader!css-loader!autoprefixer-loader'
}
] //可以有很多的loader
}
autoprefixer自动补充css前缀
- 安装
npm i autoprefixer-loader -D
- 测试 transform: translate(0px);
less的使用
- 依赖 less less-loader
处理图片
- file-loader url-loader
- 在配置的时候只使用url-loader 其依赖于file-loader
- limit设置如果在其范围内,则不单独生成文件,而是放到js中以base64
base64编码
- a-zA-Z0-9+/组成
- 其可以将二进制数据转换成字符串形式,用来传输,其是可逆,可编可解
- 将图片以base64形式存储在css的url中,减少原来对该图片的一次请求
- 但是当图片过大,按比例增加的额外大小就更多
处理字体图标
- 大小比较小
- 灵活控制颜色和大小
生成html文件插件
- html-webpack-plugin 需要下载
- 自动根据path移动当前模板的html到路径下
- 根据filename 自动引包
web-dev-server
- 热替换,不通过刷新,替换css内容
- 其通过绝对路径来监视文件,如果上级某一个路径中包含页数字符,那就无法监视
- {}()都不可以
- 全局安装、 通过命令来使用
- --inline 自动更新
- --hot 热替换热加载
- --port 指定端口
- --open 自动打开浏览器
- 建议使用项目中的程序
- 命令:
../node_modules/.bin/wds --inline --hot --open --port 9998
es6
webpack-ES6的处理
- 包 babel-preset-es2015
- 包 webpack-plugin-transform-runtime
- babel-loader依赖babel-core包
ES6中的模块
- 第一种: 默认导出、导入
- 第二种: 按需导入、声明式导出
- 默认导出 export default 拿来直接用,名称可以任意
- 按需导入: 声明式导入,必须{名称对应导出的名称}
- 全体导入的方式中,有名称的按名称来,默认导出的就是该对象的default属性
- 导入一定要在顶级域中,不能是函数中
ES6中的代码变化
vue单文件方式
以单文件的方式启动
``javascript
const path = require('path');
module.exports = {
entry:{ 入口
main:'./index.js'
},
output:{ 出口
path:path.join(__dirname,'../','code','dist'), /将所有的文件统一生成到dist目录下
filename:'build.js'
},
module:{
loaders:[{
test:/.css$/,
loader:'style-loader!css-loader!autoprefixer-loader'
},
{ / less-loader 依赖于less
test:/.less$/,
loader:'style-loader!css-loader!autoprefixer-loader!less-loader'
},{ /ttf-> 在代码中声明了引入mui.css -> 引入了ttf
test:/.(ttf|jpg|png|svg)$/,
loader:'url-loader', /依赖file-loader
},{
test:/.js$/,
exclude:/node_modules/,
loader:'babel-loader', /babel-loader依赖babel-core
options:{
presets:['es2015'], /babel-preset-es2015
plugins:['transform-runtime'],/babel-plugin=transform-runtime
}
}]
},
plugins:[
new htmlwebckplugin({
/以谁做参照
template:'./src/index.html' /自动补上引入出口文件
})
]
}
#### 重点
* vue组件的使用
* 组件间通信
* vue-router使用
* vue-resource发起http请求
* axios
#### vue介绍
* 核心 组件化 -> 自定义指令也可以认为是组件(让其不太依赖于存在的环境,尽量独立,通过参数)
* 双向数据绑定 -> 数据劫持 ES5 中的 Object.defineProperty(obj,'name',{
//设置
set:function(){ obj.name ='1234';//触发该函数
//做相关操作,(改变DOM中跟name挂钩的元素的value)
},
get:function(){ //obj.name 就会触发
}
})
* vue支持到IE8以上
* Weex 让vue编写的代码能够运行到PC、ios、Android上
* vuex 在vue中提供管理全局数据的方式的一个插件(类似于angular中的userService)
* 14年2月出来的 截止到20170615 56.7k start
* 语法糖 尤雨溪
#### 渐进式
* 跟大而全的全家桶对立,
* 可以让企业一点一点的尝试使用,双向数据绑定、路由、组件(引库的方式)
#### 数据流
* 从页面的改变影响内存 ,单向数据流
* 从内存的改变影响页面 ,单向数据流
* 两者都具备,双向数据流( 数据劫持-> ES5 -> Object.defineProperty(obj,paramName,{set:fn,get:fn}))
#### 解决闪烁问题
* 在引库的方式中存在闪烁问题,在单文件方式中不会有该问题,提前编译好html内容
* v-text 插入innerText
* v-cloak 待测试
#### vue中常用的v-指令演示
* 常用指令 ` 空串的bool就是false`
* v-text 将值插入到元素的innerText中,只能是双标签
* v-html 将值插入到元素的innerHTML中,只能是双标签
* v-if 是否插入元素
* v-show 是否显示元素
* v-model 双向数据流,其值就是数据模型(M)
#### class结合v-bind使用
* v-bind 非常有用,给元素的属性赋值
* 通过v-bind可以让vue中的对象进行运算,并将最终的动态结果赋值该该属性
* 字符串的赋值,有字符串是true,空串代表false
```html
<span v-bind:class="isRed?'red':'blue'"></span>
简写形式:class
<span :class="isRed?'red':'blue'"></span>
ES6中的代码变化
- 模块
- 默认导入出(名称可以随意)
- 在导出模块中: export default xxxxx;
- 在导入模块中: import aaa from './xxx.js'
- 接口方式导入出(按需加载)
- 在导出模块中: export var xxx = 123; --> {xxx}
- 在导出模块中: export { aaa }
- 合起来 {xxx,aaa}
- 导入的时候名称一定一定要一致 import {xxx,aaa} from 'xxx.js'
- 全体导入
- import * as xxx from 'xxx.js';
- 针对以上所有情况
- xxx = { xxx:123,aaa:xxx的值,defult:xxxxx的值}
- 针对以上所有情况
- import * as xxx from 'xxx.js';
- 默认导入出(名称可以随意)
- 函数
var obj = {
add:function(){},
substract(){ 和以上方式功能一模一样
//ES6的声明函数写法
}
}
- 对象属性
var name = 'abc'; var person = { name }
开始单文件方式
- 单文件的方式就是一一个文件代表着一个组件的方式开发
- xxx.vue的文件结构: template、script、style
- vue1.0中template可以有多个根元素
- vue2.x中只能有一个根元素
methods和v-on的使用
- 1:在导出对象的根属性中,加入methods属性,其是一个对象
- 对象内部有多个函数名称,任意的函数名称
- 再模板中直接使用函数名(xxx),没有参数直接函数名
- 在js部分的使用
- 对象内部有多个函数名称,任意的函数名称
- 2: 给元素加上v-on:事件名="函数(xxx)"
- v-on可以简写-> @事件名="函数(xxx)"
- 在模板中使用不需要this,在script中使用需要this.,这个thiss是一个VueComponent对象
v-for的使用
- 数组
v-for="(v,index) in arr" :key="v.id||index"
- 对象
v-for="(v,key,index) in obj" :key="v.id||index"
- 绑定key 是为了告诉vue 每个元素的唯一标识,提高性能
- 在删除元素的时候,vue不是整个数组进行页面的替换,而是只移除删除的DOM元素
- 为了比较页面中删除的和内存中删除的元素的关系,就需要整个key
- 如果不指定,vue又需要按照自己的算法去标识每个元素和内存对象的关系
- v-bind:class
- 选择一个,三元表达式最终返回样式名,声明一个对象也能够其key来获取其value作为样式名
- 选择多个
- 整个是一个对象,其多个属性只要为true,以key为样式名
父子组件使用(父传子)
- 父子组件的使用
- 1:创建该组件文件.vue
- 2:在需要使用组件的组件内,引入该组件
- 3:在使用其他组件内声明使用子组件
- 被使用的组件就是子,使用组件的就是父
- 样式如果需要只能被当前组件所有效,需要在style标签上加上scoped
- 父向子
- 常量: 子组件上属性 msg="xxx" 子组件声明根属性props:['msg']
- 变量: :msg="obj"
- 在js部分通过实例对象使用,this.$props.msg
子向父组件通信(获取组件对象)(扩展)
- 我个人: 吃饭 -> (吃饱饭)-> 吃饭的人就停住了
- 这种通信,基于同一个对象
export default 的常用属性总结
- 导出组件对象的根属性(options)
- data是一个函数,返回一个对象
- methods是一个对象,key是函数名,值是函数体
- components是一个对象,key是子组件名,value是组件对象
- props是一个数组,元素是接受父组件的参数
- filters是一个对象,key是过滤器名,值是过滤器函数体
- VueComponent实例对象的属性(在组件内的this)
- this.$props 父组件传递参数列表数组
- this.$parent/this.$children 父组件及其子组件对象
- this.$on this.$once this.$off 绑定(一次)事件取消事件
- this.$refs.xxx 获取DOM元素 -> 元素上声明ref="xxx"
全局组件
- 一经声明所有地方使用,无需引入和声明
- 单文件中: 1:在main.js中引入组件
- 2:通过Vue.component声明该全局组件,参数1:组件名称(驼峰命名法),参数2:组件对象
- 使用:直接使用 将大写字母改成-小写字母
- 2:通过Vue.component声明该全局组件,参数1:组件名称(驼峰命名法),参数2:组件对象
- 引库的方式也可以创建组件
var template = `
<ul>
<li>{{text}}</li>
<li>{{text}}</li>
</ul>
`;
Vue.component('myTestComponent', {
template: template,
data() {
return {
text: '哈哈'
}
}
})
看文档的对象分类
- 全局的属性和函数 Vue.xxxx
- 选项options -> 配置组件的时候传递的对象,单文件方式中export default
- 实例属性|方法 -> VueComponent对象,this对象
- var vm = new Vue(options); 也是实例对象Vue
过滤器
- vue中有没有默认的过滤,在vue中没有默认的过滤器,都需要自己手动实现
- 输入的内容帮我做一个反转
- 例子:父已托我帮你办点事
- 全局的过滤器单数函数 局部的过滤器(复数声明)
- 全局
Vue.filter('名称',function(value){ return value} )
- 局部(通过选项options),filters:{ 名称:函数体 }
- 全局
- 当两个过滤器同名的时候,以局部的优先
获取DOM元素
- 前端框架的救命稻草,操作DOM
- 1:在DOM元素上声明,ref="xxx"
- 2:可以通过实例对象.$refs.xxx获取DOM元素
- 事件(钩子函数的区别)
- 1:在created函数触发的时间点,vue实例对象完成了属性的监视、事件的初始化
- 2:在mounted函数中,已经完成了数据到DOM元素的装载,此时才可以使用$refs
vue-router
- 1: 下载该插件
npm i vue-router
- 2: 在main.js中引入该插件对象
- 3: 全局安装该插件
Vue.use(插件对象)
- 3.1通过install函数给Vue原型挂载属性,未来this.属性就能使用功能
- 4: 将router配置路由规则(创建路由对象)
- 5: 将router配置进Vue的options中
- 6: 留坑
<router-view></router-view>
命名路由
- router-link指令: to的属性,to="/xxx" -> path:'/xxx'
- :to 绑定属性则可以使用命名路由来匹配路由规则,方便url的更改维护
- :to="{name:'home'}" -> 规则:{name:'home',path:'/home'} ->href="/home"
参数router-link
- params 、query
- 命名路由名称不要相同
- 路由规则:
{name:'home',path:'/home/:who',component:组件对象}
router-link :to="{name:'home',params:{who:'xxx'} }"
href="/home/xxx"
- query:
{name:'home2',path:'/home',component:组件对象}
router-link :to="{name:'home',query:{who:'xxx'} }"
href="/home?who=xxx"
- 获取路由参数:
this.$route.params||query.属性名
总结
- 1:引包: -> 引包,声明范围,构建new Vue(options) 双向数据绑定、创建组件的使用
Vue.component(组件名,options);
参照export default返回的数据new Vue({el:'#app',template:'xxxxx',data:{text:'xxx'} })
- 2: 单文件方式:
- index.html 声明div app
- main.js 引入Vue、VueRouter、App主组件
- 构建Vue实例对象(options) -> render:c=>c(App)
- 3: 1:下载、2:引入对象、3:安装插件Vue.use(VueRouter); -> this.$router
- 4:创建rouer对象 5:配置路由规则[] ,每个规则都是对象path必填,name选填
- 4:将router配置到Vue的options中router
- vue文件注意事项
- 三个部分 template-> 1根 script-> 默认导出对象 style-> scoped当前生效
- 该对象就是options
- options: data是一个函数,返回一个对象,该对象的数据就是数据模型
- methods是一个对象,其属性是函数名,值是函数体
- components是一个对象其属性是组件名,值是组件体
- filters是一个对象其属性是过滤器名,值是过滤器体,接受一个value,返回新value 使用通过|
- props是一个数组['父传递的参数名']
- 模板直接用
- js中this.$props.属性名获取
- 父向子传递有两种,常量 xxx="xxx" 变量 :xxx="变量"
- 实例事件
- this.$on|$once|$emit|$off
- 实例属性
- this.$parent|$children|$props|$refs.xxx
- 全局函数
- Vue.use 安装插件,其插件必须实现install(Vue) 函数
- Vue.component('名称',options)
- Vue.filter('名称',function(v){ return v})
- 生僻指令
- ref="xxx"
- :key -> track by
- v-for 数组(v,index) 对象(v,key,index)
- v-bind:属性名 给元素的属性传递值 简写:属性名="vue中的data属性"
- v-on:事件 @事件="函数"
- created和mounted: created创建发起请求,mounted数据装载后操作DOM,结合$refs
- 启动方式: 只是为了方便使用了package.json文件中是scripts属性,启动的同时是开启webpack-dev-server,他会获取到当前命令行存在的webpack.config.js文件,从而获知出口文件build.js
嵌套路由
vue-resource(了解)
axios
axios.all([get1(), get2()])
.then(axios.spread(function (res1, res2) {
// 只有两个请求都完成才会成功,否则会被catch捕获
}));
mint-ui
相关环境总结
router对象的获取
单文件方式引入bootstrap
使用代理跨域
转载于:https://my.oschina.net/u/3150996/blog/1554559