# VueStudyFile
**Repository Path**: webheng/VueStudyFile
## Basic Information
- **Project Name**: VueStudyFile
- **Description**: 关于Vue的学习笔记,demo
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-01-16
- **Last Updated**: 2022-01-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Vue学习笔记
关于Vue的一些自学笔记,视频教程参考智能社Vue教程
## 第一课 了解Vue
- Vue是一个mvvm框架和angular类似,容易上手,小巧。目前常见的模式,mvc,mvp,mvvm。
- [Vue官网](https://cn.vuejs.org/)
- Vue和angular的区别:
- Vue简单易学,官网全是中文,指令v-XXX,一片html配置一个json,通过new实例化。vue是个人维护的。适合移动端项目。vue发展势头猛,可以通过github上的start数对比出。
- angular官网全是英文,需要翻墙,上手较难,指令ng-XXX,所有的属性挂载到$scope,angular是由谷歌维护的。也适合移动端项目,但是更适合PC端项目。
- 共同点,不兼容低版本的ie,ie8及ie8一下不做考虑
- 001.html vue基本雏形
- 002.html vue基本基本指令
- 指令其实是标签功能的扩展
- v-model常用在表单元素input中
- 003.html vue data中存储数据
- string Number 布尔值 arr均可以存储数据,并且展示到html中
- json数据直接在标签中渲染显示object
- 004关于vue的循环
- v-repeat在vue中会报错,目前从1.0.21开始废掉
- v-for是目前vue中循环的指令
- {{$index}}是vue在循环中配置的数据索引值
- 005关于vue的循环json
- item循环的是json每一个key下的vaule值,同样$index可以提供一个索引值
- $key提供了json数据的key值
- 006vue基础事件
- 事件形式 v-on:事件名="fun()" fun这些函数统一写在vue对象中的methods里面。在vue所有方法中所有的this指的是最初new出来的vue对象
- 常见的时间 click mousedown mouseover dblclick双击等等,具体可参见官网
- 007 控制元素显示隐藏
- 元素显示v-show ``
``里面放的是一个布尔值
- 008 一个可以增删的留言板,综合以上只是的一个demo(todolist),bootstrap+vue
- modal,bootstrap模态框,对模态框做一个简单的了解
- 模态框就是在点击一个按钮的时候调用一个弹层 例如````意思是点击这个按钮的时候去调用模态框,模态框的id是layer,
- 再比如````点击这个按钮的时候模态框消失
```html
```
- todolist的实现 具体参见008.html
## 第二课 事件深入
- 009.html
- 事件全写 v-on:事件="fun()" 事件简写 @事件="func()";
- 010.html 事件对象$event
- 事件冒泡的阻止方法
- 阻止冒泡在调用函数的时候 @click="func($event)";在具体的函数代码块里面 ev.cancelBubble = true;
- @click.stop="func()";vue提供的组织冒泡的方法
- 默认事件 比如鼠标右键 @contextmenu="func()";
- func($event) e.preventDefault();
- @contextmenu.prevent="func()";vue提供的组织默认事件的方法
- 011.html键盘事件
- 获取键盘值的方法 @keydown="func($event)"; e.keyCode;keydown和keyup的区别,up的时候文字已经进入input内了,down的是时候没有
- 键盘上用键,回车,上下左右。如果不想通过获取键值然后再进行判断去执行相应的操作,可以通过 @keydown.num = "func()";num就是那个你想触发的键的键码。
- 还有一种方式也是vue提供的 比如回车键 @keydown.enter = "func()";同理up,left,right,down等等,都可用
- 012.html属性
- 属性 在元素里面如果直接引用属性 需要a= "{{数据名}}";
- 如果不想用花括号 v-bind:a="数据名" vue推荐使用,v-bind:a="数据名";简写:a="数据名";
- 013.html class style属性说明
- class
- :class = [a,b,c,d];数组里面有几个数据就有几个class,改变数组就是改变class,abcd代表的是变量。数组可以全部当做一条数据被处理。
- :class={red:true,blue:false},这时候元素的class是class="red",json的key值因后面的布尔值生效了。true false可以跟data里面的数据变量。json可以当做一条数据被处理。
- style
- :style=[a,b,c,d] 数组中的元素必须是一个json键值对,比如[{color:"#fff""},{fontSize:"20px"}],
- 官方推荐使用json格式的数据
- 014.html模板渲染
- 模板 {{数据}} 数据更新 模板也变化,如果数据是一次性展示不需要更新如何实现。{{*数据}}代表只绑定一次。
- 字符串中带有html标签如何转义后渲染,{{{数据}}}使用三个大括号实现,在2.0中这种形式已经被取消了,直接使用v-html渲染。
- 015.html 过滤器
- 过滤器 使用方法 {{数据|过滤器}}
- vue提供了常用的过滤器 uppercase 将小写转换为大写
- lowercase大写转小写,首字母大写 capitalize
- currency 将数字转化为带金钱符号的数字 直接使用默认转换为 $num,如果想改变生成的符号,可以在过滤去后面传参,比如说{{12|currency "¥"}}就会生成人民币
- 多个过滤器的使用 {{数据|过滤器1|过滤器2|...}}
- 016.html ajax交互
- vue本身不支持ajax 如果想要使用这个功能需要引入vue-resource.js文件。
- > 使用方法 ````this.$http.get("../data/list.json").then(function(res){
console.log(res.data);
},function(){
console.log("失败函数")
});````
- > 发送数据````this.$http.get("../data/list.json",{这里是发送的服务器的数据}).then(function(res){
console.log(res.data);
},function(){
console.log("失败函数")
});````
- post同理
- > 发送数据````this.$http.get("../data/list.json",{emulateJson:true}).then(function(res){
console.log(res.data);
},function(){
console.log("失败函数")
});````
- >通用方式 ````this.$http({url:"请求地址",data:"向后台提交的数据",method:"GET/POST",jsonp:"如果是跨域请求需要写上回调函数的名字"})。then(function(res){//成功的回调},function(){//失败的回调})````
- jsonp
- > 要求````this.$http.jsonp("https://www.baidu.com/s?ie=utf-8&mod=11&isbd=1&isid=3E7BC5C518D57157&ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu",{
wd:"a"
},{
jsonp:"cb"//jsonp是依靠回调函数来执行异步请求的,vue提供的回调函数默认名是callBack,例如好搜的回调就是callBakc,所以不用做特殊处理,但是其他接口的回调命名未必叫callBack,例如百度叫cb,因此需要自己定义,其余方式不变
})````
- >通过好搜实现跨域````this.$http.jsonp("https://sug.so.360.cn/suggest",{
word:"a"
}).then(function(res){
console.log(res.data);
});````
- 017.html 利用跨域实现一个实时搜素数据的请求
- 跨域
## 第三课 Vue生存周期
- 018.html vue生存周期
- new Vue,是一个创建实例的标志,vue提供了一些函数,在vue实例化过程中供调用,命名为钩子函数,这些函数级别平行于methods,
- created:实例创建完;
- beforeCompile:实例编译前;
- compiled:实例编译完;
- ready:数据渲染完:dom元素已经插入;
- beforeDestroy:在实例销毁之前;
- destroyed:实例销毁后;
- 如何销毁一个vue对象,c.$destroy();c代表new出来的vue对象,实例被销毁,原有的已经渲染的界面不会消失,只是代表之后的vue对象下的内容不能再被使用;。
- 一般情况下页面加载完,请求数据的业务需求是在ready里面执行.
- 019.html 当数据渲染比较慢的时候,用户有可能会看到花括号的标记,这种体验并不友好。如何改善?
- 给元素一个v-cloak属性,在样式表中[cloak]{display:none;}
- ````局部渲染标签内的数据,v-text主要是渲染普通的字符串,如果字符串带有标签,会原原本本被渲染出来。
- 如果字符串带有标签且希望标签被渲染出来可以使用v-html
- 020.html如何监听一个数据,当监听到一些情况后,去改变另一个数据?
- 使用计算属性computed,实现数据的相关联
- 计算属性下面的值,本质也是一个对象,完成数据的处理,分为两个方法,首先是get,然后是set
- get是在给这个计算属性相关联的数据做操作时候会触发的函数,
- set是在给这个计算属性赋值的时候会触发的函数
- 021.html vue实例的一下相关方法
- vue对象.$el;这个就是指vue绑定的元素,c.$el.style.background ="red";
- v.$data,就是实例原本的数据对象
- c.$mount("#box");手动挂载元素
- c.$options 传给vue对象的配置,data、methods、等等,在传向vue时可以自己定义属性或者方法,使用的话就是c.$options.属性/方法;
- c.$log();主要用来查看data里数据的状态
- 022.html 针对重复的数据循环
- 在数组中vue默认重复数据不允许添加,如何解决?
- 直接在训话元素中添加track-by ````{{item}}```` track-by 后跟一个该条数据的唯一标识,例如$index
- 023.html 过滤器了解
- debounce 延时 配合事件,最合适的是键盘事件 ````````num为希望延时的时长,ms为单位 2000 代表2秒
- 针对数据的操作,limitBy 限制几个数据``{{item}}``limitBy 第一个参数代表取几个参数,第二个代表从哪儿开始,2,1,代表从1开始取两个数据,从0开始算
- ["width","height","background","orange"],只取出包含字母o的数据?
- ``{{item}}``方便使用input进行实时检索数据,并展示出来
- orderBy 对数据进行排序``{{item}}``正序排列,-1代表倒叙排
- 024.html 自定义过滤器
- > Vue.filter("name",function(v,v1,v2){
//name,为自定义过滤器的名字,v为默认最初传入的数据,v1,v2是需求看是否需要传入,自定义过滤器必须在vue实例化前注册
});
- 025.html双向过滤器
- 双向过滤器
## 第四课 自定义指令
- 026.html自定义指令
- > Vue.directive("name",function(){
//name是自定义指令的名字,在标签中调用的时候形式是v-name
});
- 在调用的时候 v-name="a",可以当做自定义之类function的参数传入
- 027.html自定义元素
- > Vue.elementDirective("zn-red",{
bind:function(){
this.el.style.background = "red";
}
});
- 028.html 自定义键盘信息
- >`` Vue.directive("on").keyCodes.ctrl = 17;``
- 029.html 监听数据变化
- $watch v.$watch("name",function(){});name代表监听数据的名字,当数据变化的时候 会触发后续的fun,单独监听一个字符串 之类的一层数据为浅度监听
- {{jsonData|json}},json过滤器,将json数据字符串化
- 深度监听 v.$watch("name",function(){},{deep:true})
## 第五课 组件化
- 030.html vue过度 动画
- bower 下载 bower install 包名
- bower 卸载 bower uninstall 包名
- 通过bower 看一个插件或框架的版本号 指令,bower info 包名
- 通过bower 下载制定版本的库 bower install 包名#版本号
- bower下载时可以自动查找其依赖
- 动画的本质是使用css3效果,通过标签内的transition实现
- 基本动画的步骤,首先元素有一个transition的属性,transition="名称";
- 其次编写css 名称-transition{transition:1s all ease;//意思是规定动画时长} 名称-enter{//动画入场效果} 名字-leave{//动画出场效果}
- 031.html结合aminate.css实现动画
- > 引入animate.css 同样在标签内给 transition一个名称,vue独立的提供了一个transition的钩子,在这个对象中可以{"name":{"enterClass":"这是入场动画,具体引用参见animate.css","leaveClass":"这是出厂动画,具体引用参见animate.css",}}
- 032.html 组件化
- 组件本质是一个大对象
- 定义一个组件的方式
- 全局组件``var Aaa = Vue.extend({
template:"这是一个标题
"
});//一个实例化的对象
Vue.component("aa",Aaa);先实例化一个对象,也就是组件,然后将这个组件命名,命名过的aa就可以在Vue实例化后被当做标签使用``
- 组件里面放数据,组件里面放数据的时候,data必须是函数的形式``var Aaa = Vue.extend({
template:"{{msg}}
",data:function(){return {msg:"这是一个组价数据"}}
});``
- 在组建中其余的methods 等按原来形式写
- 局部组件 直接引用在vue实例化对象的components对象中。
- 033.html 组件深入
- template中的模板可以放在script标签中,此时在template中将script的id引入,还有一种直接把模板写在template标签中,这种和写在script标签中类同,但是比较方便的是,有代码提示
- 034.html 动态组件
- 动态组件必须渲染成component标签
-
- 035.html 父子组件之间的通信
- 子组件获取父组件的data,使用props
- 在父组件的组件中,给子组件添加属性例如父组件的模板是``
`` msg为父组件数据,此时传递给name,子组件要想获得数据,需要初始化props:{name:""}//初始化的形式根据原始传递数据的形式初始化,这个name一定要和父组件标签中的属性名一致,这样子组件就可以顺利使用到父组件的msg数据了,
- !注意 标签中如果name 为 a-b的模式,在props中必须采用驼峰形式
- 在对组件命名的时候尽量使用小写英文
- 036.html 父组件获取子组件的数据
- 子组件向父组件发送数据 在子组件里面使用this.$emit("child-msg",data);child-msg为发送给父组件的数据名称,data为本组件的数据名称,父组件通过v-on指令接收数据,指令名称 v-on:child-msg,简写@name,此时父组件需要一个函数来收取这个数据,函数默认会接收一个参数fun(d);这个参数就是子组件的数据;child-msg必须是这个形式,不能使用其他名字
- v.$dispatch("事件名",数据);子组件向父组件发送数据
- v.$broadcast("事件名",数据);父组件向子组件广播数据
- 以上两种方式在vue2.0中已经报废
- 037.html slot 槽口、位置
- slot主要用来余留默认的静态元素例如``` ```
- 多个slot如何余留 ``在需要余留的元素中写上<元素 slot="a-slot">元素>``
## 第六课 vue路由 spa单页面应用
- 路由 根据不同的url处理不同得页面
- 038.html路由基本了解
- vue 在a标签中提供了一个v-link属性 v-link="{path:"/home"}";path即跳转 路径
- 路由内容的展示通过router-view标签实现
- 分为四步
1. 首先需要准备一个根组件
2. 准备跳转组件
3. 准备路由
4. 路由关联
5. 启动路由
- 039.html 路由初始化跳转
- 040.html 路由初始化跳转
- 041.html 多层路由即路由的嵌套 subRouter
- 042.html 路由信息的传递 通过 "/a/:name" 在路由模板元素中{{$route.params|json}}可以将参数读出,根据参数做具体的操作{{$route.path}}展示路由路径,同样链接后面也可以缀query参数,通过{{$route.query|json}}可以展示出来
## 第七课 Vue-loader
- webpack 前端模块加载器
- 最早提供前端模块化的是broserify:但是只能加载js
- nodeJs 后端模块加载器
- Vue-loader基于webpack .vue 方式的是vue组件相关代码``html放在template标签里,css放在style标签里,js放在script标签里``
- loader文件夹,手动搭建webpack,了解webpack大致原理
- index.html,最后所有的代码均渲染到此文件中,
- main.js,编写webpack代码的入口文件,官方推荐,
- App.vue,组件第一个字母大写是官方推荐
- package.json工程文件,npm init --yes 可以自动生成
- webpack.config.js,webpack的配置文件
- webpack的准备工作 npm install webpack webpack-dev-server,网速慢的话可以使用cnpm
- App.vue要编程正常的代码,需要使用vue-loader,npm install vue-loader@8.5.4 --save-dev 通过--save-dev 命令下载的模块都会在 package.json里面的devDependencies查找到
- 针对html css js的解析分别需要安装 vue-html-loader css-loader vue-style-loader vue-hot-reload-api@1.3.2
- es6转es5需要使用babel,因此需要下载 babel-loader babel-core babel-plugin-transform-runtime babel-preset-es2015 babel-runtime
- 最最核心的模块当然是vue
- vue-router 配合vue-loader使用
- 上线前 执行 webpcak -p 打包压缩,压缩后的文件就可以上线了
- vue-cli vue脚手架,脚手架就是帮你提供好了基本项目结构的
- v-clk本身集成了很多项目模板,webpack webpack-simple broswerify broswerify-simple simple
- 基本使用步骤
- npm install vue-cli -g 安装vue命令环境,如何验证已经安装完成
- vue --version如果出现版本号说明已经安装好了
- vue init 模板名称 本地文件夹名称
- 常见的模板名称 webpack webpack-simple broswerify broswerify-simple simple,本地文件夹名称是自己定义的名字
- 进入到生成的目录里面cnpm install
- npm run dev webpack 模板包含Eslint代码的检查、单元测试
# 第八课 Vue2.0变化
- 043.html 进入2.0后的变化
1. 在每段组件的模板中不再支持片段模板,组件的命名最好是有小写。
1. 组件模板之前的写法
```
我是一个组件
我是组件片段
```
2. 现在必须有根元素包裹
```
我是一个组件
我是组件片段
```
3.
```
Vue.component({
template:"",
data(){},
methods:{}
});
```
4. 2.0推出了简介的组件定义方式
```
var Home = {
template:""
}
Vue.component("my-aaa",Home);
```
- 044.html 2.0比较大的变化是实例的声明周期
- beforeCreate 组件刚刚被创建,属性还没有
- created 实例已经创建完成,属性已经绑定,但是dom还没有生成
- beforeMount 模板编译之前
- mounted 模板已经编译完成,相当于之前的ready
- beforeUpdate 组件在更新之前
- updated 组件更新之后
- beforeDestroy:在实例销毁之前;
- destroyed:实例销毁后;
- 045.html 2.0循环
- 在1.0中添加重复的数据是不被直接允许的,如果要想添加 必须使用track-by属性
- 在2.0里面默认可以添加重复的数据
- 在2.0里面去掉了一些隐式的变量
```
或者是 {{index}}{{value}}
```
```
```
- 046.html 2.0自定义键盘事件的改变
```
//通过键盘值来触发事件,不能全部覆盖
//通过键盘键名来触发事件,不能全部覆盖
-----------------------------
Vue.directive("on").keyCodes.name=num num;//name是你想起的键盘名,当然可以和原来的键盘名相同,也可以自己命名,num是这个键盘最后的值。
//通过自己定义键盘键名来触发事件,能全部覆盖
```
```
Vue.config.keyCodes.name=num;
```
- 在2.0中作者把所有的内置过滤器删除了,在2.0中json数据可以直接以字符串形式渲染到dom中
- 047.html自定义过滤器,仍然可以按照以前的方式,但是自定义过滤器传参要求有变化。
以前的传参方式``{{data|filter a b}}``,现在``{{data|filter(a,b)}}``
- 048.html组件之间的通信
- 子组件通过props获取父组件的的信息,如果想要同步数据 :name.sync就可以了,但是在2.0这种方式不被允许。
- 如何实现更改同步,父组件每次传一个对象给子组件
- 049.html 使用单一事件管理组件通信
- 父组件 详细参见代码
## 第九课 动画、路由深入
- 050.html 动画深入 之前动画是以transition属性的方式出现的,现在是一个组件
```
//class:名称-enter初始状态
//名称-enter-active动画激活时候的状态
//名称-leave、
//名称-leave-active
```
- 051.html 结合animate.css
```
vue2.0已经失效
transitions:{
enterActiveClass:"zoomInLeft",
leaveActiveClass:"zoomOutRight",
}
```
- 052.html,053.html 多个元素运动
- 多元素运动的关键是运用元素的key属性
## 第十课 路由深入
- 054.html 路由的深入
- 可以[参考官网路由讲解](https://router.vuejs.org/zh-cn/)
- 2.0基本使用步骤
- 布局配置
```
主页
新闻
```
- 配置组件
```
var Home = {
"template":"#home"
};
var News = {
"template":"#news"
};
```
- 配置路由
```
var routes = [
{path:"/home","component":Home},
{path:"/news","component":News},
{path:"*",redirect:"/home"}//重定向
{path:"/news",redirect:Home}//访问news的时候想定向到home
];
```
- 实例化路由
```
var router = new VueRouter({
routes
});
```
- 实例化vue对象路由开始
```
var c = new Vue({
"el":"#box",
data:{
msg:"welcome-vue-router"
},
router,
});
```
- 055.html嵌套路由 以及路由结合动画,子路由详细内容参考文件
# 第十一课 element-ui
- element-ui,提供好的UI,主要是为了提升开发效率,原则就是拿来直接使用
- bootstrap 简介、大方,基于jquery,核心应用栅格化系统、响应工具
- vue-webpack-simple-demo3,关于element-ui的讲解
- bootstrap是由Twitter开源
- element ui(主要针对PC端) mint-ui(主要针对移动端)都是是由饿了么团队开源
- 常用的引用方式直接在html文件中引入link标签即可,组件化的css如何引用?
- element-ui详细说明请[参考官网](http://element.eleme.io/)(中国开发)
- 关于element-ui的使用
- 安装 npm i element-ui -D//i install 简写 D --save-dev简写 S save简写
- 引入
```
import ElementUi from "element-ui"
import 'element-ui/lib/theme-chalk/index.css'
```
- 使用 这时候页面会报错,原因是因为webpack配置缺少css-loader,已经字体图标file-loader,
```
//css-loader配置
{
test: /\.css$/,
loader: 'style-loader!css-loader'
},
//sass-loader 这时候在.vue的style标签中需要 加上lang=scss属性
{
test: /\.sass$/,
loader: 'style-loader!css-loader!sass-loader'
},
//file-loader
{
test: /\.(eot|svg|ttf|woff|woff2)$/,
loader: 'file-loader'
},
```
- 按需加载相应组件
- 首先需要引入 babel-plugin-component 官方推荐使用
- 然后修改配置文件,在barbel.src新增配置
```
"plugins":[
[
"component",
[
{
"libraryName":"element-ui",
"styleLibraryName":"theme-chalk"
}
]
]
]
```
- 使用
```
//局部引用
import {Button} from "element-ui"
import {name1,name2} from "element-ui"
//注入Button之类的名字参考官网
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(Button);
//全部引用
import ElementUi from "element-ui"
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUi);
```
- 官方不再推荐使用vue-resource,变成了axios
```
axios({
method: 'Get',
url: '/list.json',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
}).then(function(res){
console.log(res);
}).catch(function(){
//失败回调
});
```
- element-ui主要运用在PC端,mint-ui主要运用在移动端,可以[参考官网](http://mint-ui.github.io/#!/zh-cn)
- 自定义组件如果想添加事件,形式 事件.native