少则得,多则惑,其出弥远,其知弥少!
小白眼中的前端开发:
◆ 会写 HTML+CSS+JavaScript 就会前端开发
◆ 需要美化页面样式,就拽一个bootstrap过来
◆ 需要操作DOM或发起Ajax请求,再拽一个jQuery过来
◆ 需要快速实现网页布局效果,就拽一个Layui过来实际前端开发:
◆ 模块化(js的模块化、css的模块化、资源的模块化)
◆ 组件化(复用现有的UI结构、样式、行为)
◆ 规范化(目录结构的划分、编码规范化、接口规范化、文档规范化、Git分支管理)
◆ 自动化(自动化构建、自动部署、自动化测试
目录
Vue2.0-1 Vue简介
Vue2.0-2 Vue基本用法 初体验
Vue2.0-3 Vue六大指令
Vue2.0-4 综合案例
Vue2.0-5 入门总结
Vue2.0-6 过滤器
Vue2.0-7 侦听器
Vue2.0-8 computed计算属性(了解)
Vue2.0-9 axios专注数据请求
Vue2.0-10 vue-cli
Vue2.0-11 组件
Vue2.0-12 组件的props
Vue2.0-13 scoped属性解决 样式冲突
Vue2.0-14 组件的声明周期
Vue2.0-15 数据间传值
Vue2.0-16 $refs 引用
① 官方概念:Vue是一套用于构建用户界面的前端框架。
√1、构建用户界面:用vue往html页面中填充数据,非常方便。
√2、框架:我们要学习Vue的指令、组件(是对UI结构的复用)、路由、vuex、vue组件库。
② vue的特性:数据驱动视图和双向数据绑定
特性 | 作用 | 说明 |
---|---|---|
数据驱动视图 | 数据的变化会驱动视图自动更新 | 页面结构会被vue自动渲染 |
双向数据绑定 | form表单负责采集数据,Ajax负责提交数据到js数据中 | vue自动获取表单数据 |
③ MVVM是vue实现数据驱动视图和双向数据绑定的MVVM核心原理,它把每个HTML页面拆分成了三部分:
√1、Model: 表示当前页面渲染时所依赖的数据源
√2、View: 表示当前页面所渲染的DOM结构
√3、ViewModel: 表示vue实例,它是MVVM的核心
{{ message }}
注意:指令是vue开发中最基础、最常用、最简单的知识点
序列 | 按照用途分类 | 命令 |
---|---|---|
① | 内容渲染指令 | v-text="message"、{{ message }}、v-html="message" |
② | 属性绑定指令 | v-bind:value="message" 简写用冒号:value="message" |
③ | 事件绑定属性 | v-on:click 简写用@click |
④ | 双向绑定指令 | v-model="message" |
⑤ | 条件渲染指令 | v-if="true"移除元素 v-show="false"修改display:none |
⑥ | 列表渲染指令 | v-for="(item,index) in list" |
① 内容渲染指令
{{ message }}
② 属性绑定指令
{{ number + 1 }}
{{ ok ? 'yes' : 'no' }}
{{ message.split('').reverse().join('') }}
③ 事件绑定指令 事件修饰符 按键修饰符
{{ count }}
跳转到百度
const vm = new Vue({
el: "#app",
data: {count: 0},
methods: {
sub(){ this.count-- ; },
add(n){ this.count += n ; },
changeColor(e){ e.target.style.backgroundColor = 'red'; },
changeColor1(n,e){ e.target.style.backgroundColor = 'blue'; },
show(){ console.log("事件修饰符,阻止a标签跳转"); }
}
})
事件/按键修饰符 | 说明( 红色为常用事件 ) |
---|---|
.prevent | 阻止默认行为(例如:阻止a连接的跳转、阻止表单的提交等)@click.prevent |
.stop | 阻止事件冒泡 |
.capture | 以捕捉模式触发当前的事件处理函数 |
.once | 绑定的事件只触发一次 |
.selt | 只有在event.target是当前元素自身时触发事件处理函数 |
.enter(按键修饰符) | 按下Enter键时触发相应功能 例如:@keyup.enter = "submit" |
.esc(按键修饰符) | 按下Esc键时触发功能 例如:@keyup.esc = "clearValue" |
④ 双向绑定指令
data: {
city: 2
}
v-model专用修饰符 | 作用 | 实例 |
---|---|---|
.number | 自动将用户的输入值转为数值类型 | |
.trim | 自动过滤用户输入的首尾空白字符 | |
.lazy | 在"change"时而非"input"时更新 |
⑤ 条件渲染指令
加油
良好
优秀
当flag为true时,显示该元素
⑥ 列表渲染指令
{{"索引"+index}}: {{item.name}}
data: {
list: [
{id:"A",name:"张三",age:"20"},
{id:"B",name:"李四",age:"80"}
]
}
① 案例界面
② 关键代码展示
// 1、渲染数据
{{ item.id }}
{{ item.name }}
// 2、动态生成checkbox的id属性值,添加v-mode 并做if判断
{{ item.time }}
// 3、传入id实现删除功能
删除
① 能够知道vue的基本使用步骤
② 掌握vue中常见指令的用法
③ 掌握vue中过滤器的基本用法
① 私有过滤器
{{ message | capitalize }}
② 全局过滤器
{{ message | capitalize }}
③ 格式化时间过滤器
{{ date | capitalize }}
④ 调用多个过滤器 Vue 3.0 剔除了过滤器
{{ msg | capitalize(arg1,arg2) }}
侦听器格式 | 优缺点 |
---|---|
方法格式侦听器 | 缺点①:无法自动触发。缺点②:如果侦听对象数据,是不会触发侦听 |
对象格式侦听器 | 优点①:使用immediate选项自动触发一次。优点②:通过deep选项,侦听对象数据。 |
① 侦听器基本语法
② 判断用户名是否被占用
③ immediate选项 侦听器自动执行一次
④ 开启deep深度监听对象数据的变化
√特点:要被定义为方法,在使用计算时,当普通属性使用即可。
√好处:实现代码复用,只要计算属性依赖的数据源发生变化,则计算属性自动重新求值!
① 基本语法
② 结合 async 和 await 调用axios
// 如果调用的方法返回值是Promise实例,则前面可以添加 await
// await 还能用在 async 修饰的方法中
document.querySelector('#btn').addEventListener('click',async function(){
const result = await axios({
method: 'post',
url: 'http://www.liulongbin.top:3006/api/post',
data: {
name: 'zs',
age: 19
}
})
console.log(result);
})
③ 使用解构赋值
// 1、调用axios之后,使用async / await 进行简化
// 2、使用解构赋值,从axios封装的大对象中把 data 属性解构出来
// 3、把解构出来的 data 属性,使用冒号进行重命名,一般命名为 { data:res }
document.querySelector('#btnGet').addEventListener('click',async function(){
const { data:res } = await axios({
method: 'get',
url: 'http://www.liulongbin.top:3006/api/getbooks',
params: {
id: 1
}
})
console.log(res.data);
})
④ 基于axios发起get和post请求
// GET请求
document.querySelector('#btnGet').addEventListener('click',async function(){
const {data:res} = await axios.get('http://www.liulongbin.top:3006/api/getbooks?id=1')
console.log('get请求',res);
})
// POST请求
document.querySelector('#btnPost').addEventListener('click',async function(){
const {data:res} = await axios.post('http://www.liulongbin.top:3006/api/post',{username:'zs',age:19})
console.log('post请求',res);
})
① vue-cli 简介与安装
√vue-cli是Vue.js开发的标准工具,简化了程序员基于webpack创建工程化的Vue项目过程。
√引用vue-cli官网上的一句话:程序员可以专注在撰写应用上,而不必花时间纠结webpack配置的问题。
// vue-cli 是 npm 上的一个全局包 用-g参数安装
E:\Demo\vue-cli>npm install -g @vue/cli
// 查看安装是否成功
E:\Demo\vue-cli>vue -v
// 注意:如果报错 一般是安装的位置不对 将vue-cli东西拷贝到nodejs文件夹内
E:\Demo\vue-cli>npm list --global
② 创建vue项目
// 1、vue create 项目名称
E:\Demo\vue-cli>vue create demo-test
// 2、选择手动安装功能
> Manually select features
// 3、选择babel 和 Css Pre-processors
(*) Babel -- 必须安装babel
( ) TypeScript -- 微软的脚步语言 比javascript更强大
( ) Progressive Web App (PWA) Support -- 渐进式web框架
( ) Router -- 路由
( ) Vuex -- vuex
>(*) CSS Pre-processors -- 选择CSS 预处理器
( ) Linter / Formatter -- 格式校验 约束团队使用固定格式,比方说用单引号还是双引号
( ) Unit Testing
( ) E2E Testing
// 4、选择2.0版本
> 2.x
// 5、选择less
> Less
// 6、选择独立的配置文件
> In dedicated config files -- 将babel、ESLint等插件放到独立配置文件
In package.json -- 将配置文件放到package.json文件中
// 7、选择Y创建成预设配置,然后输入预设名即可
// 8、在VSCode启动终端 访问主页
Terminal -> new Terminal 或 Ctrl + Shift + `
E:\Demo\vue-cli\demo-first> npm run serve
App running at:
- Local: http://localhost:8080/
- Network: http://192.168.1.2:8080/
③ vue项目中src目录的构成
√assets 文件夹:存放项目静态资源,例如:CSS样式表,images图片资源
√components 文件夹:程序员封装的可复用的组件
④ vue项目的运行流程
在工程化的项目中,vue要做的事很单纯:通过main.js把App.vue渲染到index.html 的指定区域中
√1、App.vue 用来编写待渲染的模板结构
√2、index.html 中需要预留el区域
√3、main.js 把App.vue 渲染到了index.html 所预留的区域中
⑤ 基本使用
目录结构
|Demo
|----public
|--------index.html
|----src
|--------main.js
|--------Test.vue
这是第一个vue工程项目
import Vue from 'vue'
import Test from './Test.vue'
Vue.config.productionTip = false
new Vue({
// h(Test) 指向 import Test
render: h => h(Test),
}).$mount('#app')
① vue 组件的三个组成部分
√什么是组件化开发:根据封装思想,把页面上可重用的UI结构封装为组件,从而方便项目开发和维护
√vue中规定:组件的后缀名是.vue
√vue组件的三个组成部分:
内容 | 说明 |
---|---|
template | 组件的模板结构 |
script | 组件的JavaScript行为 |
style | 组件的样式 |
Test.vue中代码示例:
1、data必须是一个函数,用return返回数据
2、methods方法、watch侦听、computed计算、filters过滤器
3、style中启用less样式
这是第一个 vue 工程项目 {{ msg }}
要想使用less样式 必须在style中启用 lang="less"
// 启用less样式
② 使用组件的三个步骤
◆ 步骤1、使用import语法导入需要的组件
import Left from '@/components/left.vue'
import Right from '@/components/right.vue'
◆ 步骤2、使用 components 节点注册私有组件
export default {
components: {
Left,
Right
}
}
◆ 步骤3、以标签形式使用刚才注册的组件
③ 在main.js中通过Vue.component注册全局组件
import Vue from 'vue'
import App from './App.vue'
// 导入需要被全局注册的那个组件
import Count from '@/components/Count.vue'
Vue.component('MyCount',Count);
Vue.config.productionTip = false
new Vue({
render: h => h(App),
}).$mount('#app')
④ 常用的插件
① props 是组件的自定义属性,在封装通用组件的时候,合理使用props可以极大提高组件的复用性
# 父对象
{{ count }}
#子对象引用
// 结合v-bind使用自定义属性
② props 的 default 默认值,类型校验,必填校验
export default {
props: {
init: {
// 用default属性定义默认值
default: 0,
// init的值必须是指定类型 Number/String/Boolean/Array/Object...
type: Number,
// 必填校验项
require: true
}
}
}
// 只要用到样式就要追加scoped属性,该属性表示样式只在当前文件生效
① 生命周期 & 生命周期函数
√生命周期(Life Cycle)是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段。
√生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行。
√created、mounted、undated 三个周期比较重要
② created生命周期函数很重要
① 父向子传值:父组件向子组件共享数据需要使用自定义属性
② 子向父传值:子组件向父组件共享数据使用自定义事件
③ 兄弟组件间数据共享:使用EventBus
√1、 创建eventBus.js模块,并向外共享一个Vue的实例对象
√2、 在数据发送方,调用bus.$emit('事件名称',要发送的数据)方法触发自定义事件
√3、 在数据接收方,调用bus.$on('事件名称',事件处理函数) 方法注册一个自定义事件
每个vue的组件实例上,都包含一个$refs对象,默认情况下$refs指向一个空对象
① 使用 ref 引用DOM元素
// 元素上使用ref属性
App根节点
② 使用 ref 引用组件实例
App根节点
③ this.$nextTick(cb)的应用场景:
// 显示输入框时 自动获取焦点
export default {
data(){
return {
flag: false
}
},
methods: {
btn(){
this.flag = true;
// this.$nextTick(cb)方法:在组件的DOM更新完后执行cb回调函数
this.$nextTick(()=>{
this.$refs.inputRef.focus();
})
},
hidden(){
this.flag = false;
}
}
}
④ some循环:满足条件退出循环 比forEach性能好
⑤ every循环 判断是否全选中
export default {
data(){
return {
arr: [
{name: "A",status: true},
{name: "B",status: true},
{name: "C",status: true},
],
}
},
methods: {
ereryBtn(){
// 当所有数据为true返回true 否则返回false
const flag = this.arr.every(item=>item.status);
console.log(flag);
}
}
}
⑥ reduce汇总 用法和简写用法
methods: {
reduceBtn1(){
// 复杂reduce写法 arr.filter(item=>item.status).reduce((累加的结果,item)=>{},初始值)
const sum = this.arr.filter(item=>item.status).reduce((sum,item)=>{
return sum += item.price * item.count ;
},0)
console.log("reduce:"+sum);
},
reduceBtn2(){
// 简写reduce代码 建议用下面的代码
const sum = this.arr.filter(item=>item.status).reduce((sum,item)=>sum += item.price * item.count,0)
console.log("reduce:"+sum);
}
}