Vue2
2021-03-19 14:48:28 0 举报
AI智能生成
Vue入门,包括Vue基础语法、组件化开发、前端模块化、Webpack入门、Vue-CLI、Vue Router、Vuex和Axios的学习
作者其他创作
大纲/内容
一、初识
简介认识
安装
npm
cdn
download
vue-cli
生命周期
MVVM
options
el
method
data
computed
......
二、基础语法
插值语法
mustache
v-clock
等解析完后再显示数据
v-once
只显示第一次的数据
v-html
解析为html
v-text
解析为文本,同mustache
v-pre
不解析mustache语法
动态绑定属性(v-bind)
作用
用于动态绑定一个或多个属性值,或者向另一个组件传递props值
缩写
:
绑定链接
v-bind:src="Url"
绑定class
对象语法
v-bind:class="a()"
v-bind:class="{pink: ispink,blue: isblue}
数组语法
:class='[a,b]'
绑定style属性
:style="{color: c, fontSize: s}"
计算属性(computed)
简介
原理实现
计算属性的setter和getter
计算属性的缓存
计算属性会进行缓存,如果多次使用时,计算属性只会调用一次
同methods的区别
事件监听(v-on)
作用
绑定事件监听器
缩写
@
参数
三种情况
有形参不加括号
无形参不加括号
有形参有括号
修饰符
.stop
阻止事件冒泡
.prevent
阻止默认事件
监听键盘按键
{.keyCode}
{.keyAlies}
.once
只触发一次回调
.native
监听组件根元素的原生事件
条件判断
v-if
v-else-if
v-else
v-show
和v-if的区别
v-if和v-show都可以决定一个元素是否渲染
v-if当条件为false时,压根不会有对应的元素在DOM中。
v-show当条件为false时,仅仅是将元素的display属性设置为none而已。
作用
用于决定一个元素是否渲染
如何选择
当需要在显示与隐藏之间切片很频繁时,使用v-show
当只有一次切换时,通过使用v-if
作用
Vue的条件指令可以根据表达式的值在DOM中渲染或销毁元素或组件
循环遍历
遍历数组
遍历对象
key属性
作用
高效的更新虚拟DOM
原理
过滤器(filters)
作用
用于一些常见的文本格式化(过滤到你做想要的数据结果格式)
v-model
应用
作用
实现表单元素和数据的双向绑定
原理
v-on结合v-bind
结合radio使用
互斥选择
结合checkbox使用
单选(同意协议)
多选
结合select使用
单选
多选
值绑定
动态更新数据
修饰符
lazy
number
trim
综合案例:购物车案例
三、组件化开发
1.组件化思想
完整的页面拆分为多个组件
单个组件实现某个功能
组件还可进一步拆分
2.注册组件的基本步骤
1.创建组件构造器
Vue.extend({
template: ``
})
template: ``
})
2.注册组件
Vue.component(组件标签名, 组件构造器)
3.使用组件
直接使用注册组件绑定的标签名
必须挂载在某个Vue实例下
3.全局组件和局部组件
全局使用
局部使用
4.父组件和子组件
组件树
在父组件注册下的子组件无法在其它没有注册它的组件下使用(包括App)
5.注册组件语法糖
Vue.component('cpn1',{
template:`
<div>我是全局注册组件</div>`
})
6.组件抽离
将template定义的组件样式进行抽离
方法一:script标签
<script type="text/x-template" id="cpnC1">
方法二:template标签
<template id="cpnC2">
7.组件数据存放问题
1.组件无法直接访问父级和Vue实例的数据
2.组件使用data()函数来存放数据
原因
8.父子组件通信
父级向子级传递数据
props
步骤
1.创建子模版
2.父组件绑定子组件
3.子组件定义props属性
4.父组件定义的子组件标签定义属性绑定父组件数据(v-bind:)
5.子组件使用父组件的数据
类型
数组
对象(常用)
组件命名问题(驼峰命名法)
子级向父级传递数据
自定义事件
子组件通过$emit()触发事件
父组件通过v-on监听子组件事件
流程
1.子组件注册点击事件并将要传递的值作为参数
@click="cclick(item)"
2.通过子组件的methods发送事件
cclick(item){this.$emit('传递给父组件的事件名字', 传递的数据(item)}
3.在绑定的dom节点上将事件传递给父组件
@传递给父组件的事件名='父组件接收的事件名'
4.父组件methods属性处理接收到的子组件事件
父组件接收的事件名(子组件传递的数据){}
加减器案例
父组件直接访问子组件
$children
🔺一般用在需要找到所有子组件的情况下
返回包含所有子组件的数组
$refs
$refs和ref指令通常是一起使用的
步骤
1.我们通过ref给某一个子组件绑定一个特定的ID
2.通过this.$refs.ID就可以访问到该组件了
子组件直接访问父组件
$parent
$root
直接访问根节点
9.插槽
作用
具名插槽
通过定义插槽名将插入内容与插槽一一对应
作用域插槽
编译作用域
通过父组件里拿到子组件插槽的数据并改变值的显示方式
slot-scope
v-slot
1.子组件:<slot name="aaa" :data="fruits"></slot>
2.父组件:v-slot:aaa="message"
3.获取值:{{message.data.join(' * ')}}
四、webpack
1.概念
前端模块化
打包
同grunt/gulp的对比
2.安装
全局安装
局部安装
3.起步过程
1.创建对应的文件夹
2.打包
webpack src/main.js dist/bundle.js
3.index.html引用打包后的文件
<script src="dist/bundle.js"></script>
4.配置
配置出口和入口
局部安装webpack进行打包的问题
解决方法
1.
2.npm run build
5.Loader
简介
通用使用过程
1. 通过npm安装需要使用的loader
2. 在webpack.config.js中的modules关键字的loaders下进行配置
css-loader、style-loader
less-loader
图片处理
url-loader
file-loader
babel-loader
vue-loader、vue-template-compiler
6.webpack配置vue
配置
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
},
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
},
单文件组件
1.loader安装
2.webpack.config.js配置
关注点分离
7.webpack-plugin
简介
是什么
同loader的区别
使用过程
添加版权信息插件
引入
const webpack = require('webpack')
使用
plugins: [
new webpack.BannerPlugin('我是版权信息哈哈哈')
]
new webpack.BannerPlugin('我是版权信息哈哈哈')
]
打包html插件
安装
npm install html-webpack-plugin --save-dev
引用
const HtmlWebpackPlugin = require('html-webpack-plugin')
配置
plugins: [
new webpack.BannerPlugin('我是版权信息哈哈哈'),
new HtmlWebpackPlugin({
template: "main.html" //模板
}),
],
new webpack.BannerPlugin('我是版权信息哈哈哈'),
new HtmlWebpackPlugin({
template: "main.html" //模板
}),
],
js压缩插件
安装
npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
引用
const Uglifyjs = require('uglifyjs-webpack-plugin')
配置
plugins: [
new Uglifyjs(),
],
new Uglifyjs(),
],
本地node服务器插件
安装
npm install --save-dev webpack-dev-server@2.9.1
使用
devServer: {
contentBase: './dist/',
inline: true,
port: 3333
}
参数说明
配置
在package.json文件中可以定义--open直接打开该服务
8.webpack配置文件分离
安装相应插件
npm install webpack-merge --save-dev
引入
const webpackMerge = require('webpack')
文件分离
1. base.config.js(基础)
2. prod.config.js(生产环境)
3. dev.config.js(开发环境)
9.打包文件
app.js
当前应用程序开发的所有代码
mainifest
打包代码的底层支持~联想一下CommonJS AMD CMD标准,使浏览器能识别那些导出导入规则
vendor
第三方框架(bs\axios\vue)代码
五、Vue CLI
简介
特点
安装
npm install @vue/cli -g
创建
vue create 项目名
CLI2
vue init webpack 项目名
可视化界面
vue ui
初始化项目选项
Runtime-Compiler和Runtime-only的区别
render和template
三种使用方式
项目目录
CLI4和CLI2大体一样,但会少了很多文件夹(进行了隐藏处理)
build和dev
npm run build
npm run dev
可以使用vue ui去操作这两个选项
配置查看以及修改
vue ui
可视化界面
添加相关插件以及移除
运行时编译和发布时编译
配置文件位置
node_modules文件夹下
修改文件配置
项目根目录下新建vue.config.js文件
添加相关配置
tabbar案例
六、Vue Router
作用
路由器
概念
广义
狭义
后端路由
前端路由
单页面富应用阶段(SPA)
url→hsah
location.hash = 'url地址'
html5→history
history.pushState({data},'title','url')
history.back()
history.replaceState({data},'title','url')
history.go(n)
history.forward()
安装
方法一:npm install vue-router --save
方法二:创建脚手架时将该选项选上
router文件夹下进行配置
使用步骤
结合笔记
路由默认路径
html5的history模式
router-link样式设置
代码实现路由跳转
$router.push('url')
$router.replace('url')
动态路由(params)
设置
router:index.js
path: '/user/:userid'
App.vue
方法一:路由控件直接跳转
<router-link :to="'/user/'+ userid" tag="button">用户</router-link>
方法二:methods绑定按钮点击事件实现跳转
this.$router.push('/user/'+this.userid)
获取路由信息
<h1>lalala,我叫{{$route.params.userid}}</h1>
路由懒加载
原因
使用
const Home = () => import('../views/Home.vue')
三种方式
const Home = resolve => { require.ensure(['../components/Home.vue'], () => { resolve(require('../components/Home.vue')) })}
const About = resolve => require(['../components/About.vue'], resolve)
const Home = () => import('../components/Home.vue')
路由嵌套
注意,嵌套路由不能加'/'
✔path: 'news',
×path: '/news',
步骤
1.在需要嵌套的组件定义router-view和router-link标签
2.router中的index.js挂载子组件路由
路由默认路径
{
path: '',
components: HomeMessage
}
path: '',
components: HomeMessage
}
参数传递
params
动态路由
query
传递方式
<router-link :to="{path:'/home/message',query:{name:'你好啊',age:19}}" tag="button">消息</router-link>
通过绑定事件
参数获取
params的通过`$route.params`获取数据
query的通过`$route.query`获取数据
$route和$router的区别
$route主要是用来动态获取当前路由
$router是用来获取路由对象
$router为VueRouter实例,想要导航到不同URL,则使用$router.push方法
$route为当前router跳转对象(动态获取到当前跳转到的路由路径),里面可以获取当前路径的name、path、query、params等
URL
概念
protocol :// hostname[:port] / path / \[;parameters\]\[?query\]#fragment
参数含义
protocol(协议)
hostname(主机名)
port(端口号)
path(路径)
parameters(参数)
query(查询)
fragment(信息片断)
导航守卫
简介、作用
beforeEach钩子函数
前置钩子
afterEach钩子函数
后置钩子
类型
全局导航守卫
路由独享守卫
组件导航守卫
导航解析流程
keep-alive
相关联函数
activated()
当前路由活跃状态下调用的函数
deactivated()
路由跳转后之前路由调用的函数
属性
pinclude
只有匹配的组件会被缓存
pexclude
任何匹配的组件都不会被缓存
案例
实现保留切换首页后最后一次的首页子路由位置
beforeRouteLeave()
activated()
七、Vuex
简介
作用及使用原因
状态自管理应用
多组间共享状态
基本使用
安装
脚手架搭建项目时勾选
npm i vuex --save
基本创建
1.store中的index.js
2.引入vue和vuex
3.安装vuex
Vue.use(Vuex)
4.新建实例
const Store = new Vuex.Store({
})
5.导出stroe
使用
state: {
//......
}
状态管理,相当于data
mutations: {
//......
}
行为管理,相当于methods
注意:虽然我们可以在组件中通过自定义方法(method)的方式去改变state的值,但是官方不推荐这样做,这样会破坏状态的统一管理(Vuex可以更明确的追踪状态的变化,所以不要直接在其它地方改变store.state中的值)
State单一状态树
正如其名,官方只推荐定义一个store去管理这些状态,否则后期维护会变得更加麻烦
Getters
相当于计算属性computed
如果要传递参数则直接返回函数
参数
state
getters
mutations
组件使用
this.$store.commit("方法名")
传递参数(payload)
组件
this.$store.commit("mutation", data(obj))
store
mutation_name(state,payload) {
//...
//payload.data
}
//...
//payload.data
}
提交风格
对象风格
this.$store.commit({
type: "mutation",
data: data
})
type: "mutation",
data: data
})
普通风格
this.$store.commit("mutation", data(obj))
数据响应式原理
给state中的原有对象新增属性时出现的问题
Vue.set(obj, key, value)
类型常量
定义
使用
mutation-type.js
只能定义同步函数
原因
异步函数state中的数据不会改变
Action
特性
Action 提交的是 mutation,而不是直接变更状态
Action 可以包含任意异步操作
也可以在里面实现复杂的逻辑判断
context参数
和store的异同(联系模块的局部状态)
作用
使用
store
action_name(context,payload) {
setTimeout(() => {
context.commit('mutation_name',payload)
},1000)
}
setTimeout(() => {
context.commit('mutation_name',payload)
},1000)
}
组件
this.$store.dispatch({
type: "action_name",
data
})
type: "action_name",
data
})
promise改进
Module
使用
modules: {
a: {
state: () => ({ ... }),
mutations: { ... },
actions: { ... }
}
}
a: {
state: () => ({ ... }),
mutations: { ... },
actions: { ... }
}
}
模块的局部状态
mutations
getters
根节点的状态为第三个参数(rootState)
action
context
局部状态通过 `context.state` 暴露出来,根节点状态则为 `context.rootState`
调用问题
module对象内部的mutation和action都是通过this.$store调用
项目结构
规则
1. 应用层级的状态应该集中到单个 store 对象中
2.提交 mutation 是更改状态的唯一方法,并且这个过程是同步的
3. 异步逻辑都应该封装到 action里面
如果store 文件太大,只需将 action、mutation 和 getter 分割到单独的文件
结构
结构图
八、axios
简介
和ajax关系
同jquery ajax的异同
特性
安装
npm
cdn
初步使用
axios({
url:'"url"
}).then(res => {
//...
}).catch(err => {
//...
})
url:'"url"
}).then(res => {
//...
}).catch(err => {
//...
})
并发请求
axios.all([axios(),axios(),...])
并发请求
axios.spread((res1,res2,...) => {...})
返回数据
默认配置
格式
axios.defaults.baseURL = '......'
常见配置
axios实例
创建的原因
创建方法
axios.create()
封装axios
原因
使用
1. src→network→request.js
2. 引入axios模块(通用)以及创建封装函数
3.创建实例并进行相关默认配置,最后返回该实例
export function request(config) {
const te = axios.create({
baseURL: 'http://localhost:3000',
method: 'get',
timeout: 5000
})
return te(config)
}
4. 组件使用(promise)
request('http://localhost:3000/middleschool')
.then(res => {
console.log(res)
})
拦截器
简介
作用
请求拦截器
1. 发送网络请求时,在页面显示loading请求图标
2. 在需要用户输入信息时(比如登录),判断用户是否有token,如没有,则会跳转到登录界面
3. 对请求的参数进行序列化和修改
4. 请求拦截中错误拦截较少,通常都是配置相关的拦截,可能的错误比如请求超时,可以将页面跳转到一个误页面中
响应拦截器
1. 响应成功:主要是对数据进行过滤
2. 响应失败:根据status判断报错的错误码,跳转到不同的错误提示页面
使用
请求拦截
te.interceptors.request.use( config => {}, err=> {})
响应拦截
te.interceptors.response.use( res => {}, err=> {})
注意:记得拦截处理完后return config/res
九、其它
代码解析
正常情况下:js→字节码→浏览器(解析)
V8引擎:ja→二进制代码→浏览器(直接渲染)
修改vue preset预设
user/用户名/.vuerc
文件夹路径别名设置
CLI2
在build文件夹下,在webpack.base.conf.js文件内,在导出对象中的resolve对象中修改添加alias对象代码
CLI4
在项目根目录新建vue.config.js文件按下面添加代码,原理同CLI2类似
注意
html代码的src以及link路aaa/aaa径需要在变量前加~,如assets,在Dom节点中,也就是html页面中,需要设置为~assets,在导入模块则不需要---`import a from ‘assets/a’`
所有组件都会继承自Vue的原型
vue中使用Object.defineProperty('类','键','值')去定义类的属性
devtools
安装
google chrome商店
极简插件
npm
Promise
三种状态
1.初始化,状态:pending
2.当调用resolve(成功),状态:pengding=>fulfilled
3.当调用reject(失败),状态:pending=>rejected
链式调用
all()方法
0 条评论
下一页