一. es6语法
1. 认识let和const
1)let声明变量,let声明的变量属于局部作用域
2)const声明常量
2. 模板字符串
3. 箭头函数
4. 对象的单体模式
5. 面向对象
二. nodejs服务器语言
npm init --yes 初始化我们的项目,自动生成一个package.json文件
npm install jquery --save
npm install webpack --save-dev
npm run dev 运行环境
npm run build 编译代码
npm install -g cnpm -registry=https://registry.npm.taobao.org 下载使用cnpm提高速度
三. Vue基础
1. {{}}:模板语法插值
{{变量}}
{{1 + 1}}
{{'hello'}}
{{函数的调用}}, 例如:{{ 'hello world'.split("").reverse().join()}}
{{1 == 1 ? '真的' : '假的'}}
2. 创建简单的Vue对象
{{title}}
3. 指令系统
在vue中提供了一套为(数据驱动视图)更为方便的操作,这些操作被称为指令系统,以v-xxx所表示。
指令中封装了一些DOM行为,结合属性作为一个暗号,暗号有相应的值,根据不同的值,框架会进行相应的DOM操作的绑定。
1) v-text和v-html
v-text等价于{{}} 实现原理:innerText
v-html实现原理:innterHTML
2)条件渲染
(1)v-if,表示条件渲染
v-else-if
v-else
v-if是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建
v-if也是惰性的:如果在初始渲染时条件为假,则什么也不做-----直到条件第一次变为真时,才会开始渲染条件快。
相比之下,v-show就简单的多---不管初始条件是什么,元素总是会被渲染,并且只是简单地基于CSS进行切换。
一般来说,v-if有更高的切换开销,而v-show有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用v-show较好;如果在运行时条件很少改变,则使用v-if较好。
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示True
if条件显示False
Adam
Bruce
Chris
v-else元素必须紧跟在v-if或v-else-if元素后面,否则将不会被识别
(2)v-on,事件
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示
(3)v-show,显示内容
v-show的元素始终会被渲染并保留在DOM中。v-show只是简单地切换元素的CSS属性display
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示
演示v-show
3)class与style绑定
使用v-bind: class = '{} || [] || 变量名 || 常量' 对我们的页面中标签的属性进行绑定。所有的属性都可以进行绑定,注意只要使用了v-bind后面的字符串一定是数据属性中的值
a. 绑定字符串
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示
演示v-show
演示绑定
b. 绑定图片
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示
演示v-show
演示绑定
c. 绑定时间
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示
演示v-show
演示绑定
显示时间
d. 绑定类
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示
演示v-show
演示绑定
显示时间
我们可以吧一个数组穿个v-bind:class,以应用一个class列表:
data: {
activeClass: "active",
errorClass: "text-align",
}
3)事件处理
(1)监听事件
可以用v-on监听DOM事件,并在触发时运行有一个JavaScript代码
vue中使用v-on:click对当前DOM绑定click事件 注意:所有的原生js的事件使用v-on都可以绑定
{{msg}}
{{1>2?"TRUE":"FALSE"}}
if条件显示
演示v-show
演示绑定
显示时间
v-on与v-if的结合:
轮播图实现:
-
{{ index + 1}}
v-on的几个好处:
1. HTML模板能轻松定位在JavaScript代码里对应的方法
2. 无需在JavaScript里手动绑定事件,ViewModel代码可以是非常纯粹的逻辑,和DOM完全解耦,更易于测试
3. 当一个ViewModel被销毁时,所有的事件处理器都会自动被删除。
在Vue中的简写:
4)列表渲染
一个数组列表的v-for,用v-for把一个数组对应为一组的元素。
v-for
我么用v-for指令根据一组数组的选项列表进行渲染,v-for指令需要使用item in items形式的特殊语法,items是元数据数组并且item是数组元素迭代的别名。
另外:v-for还支持一个可选的第二参数为当前项的索引
-
{{index}}: {{item.name}}, ¥{{item.price}}
- {{index+1}}
5)v-html解析标签
- {{index+1}}
4. 组件
这里有两种组件的注册类型:全局注册和局部注册。
1)通过Prop向子组件传递数据
prop是可以在组件上注册的一些自定义特性。
(1)在子组件自定义特性
当一个值传递给一个prop特性的时候,它就变成了那个组件实例的一个属性,那么我们就可以像访问data中的值一样
(2)要在父组件中导入的子组件内部绑定自定义的属性
注意:一个组件默认可以拥有任意数量的prop,任何值都可以传递给任何prop。
2)通过事件向子组件传递数据
我们可以调用内建的$emit方法并传入事件的名字,来向父级组件触发一个事件
(1)给子组件中的某个按钮绑定原生事件,我们可以调用内建的this.$emit('自定义的事件名', '传递的数据'),来向父级组件触发一个自定义事件
(2)在父组件中的子组件标签中,要绑定自定义的事件
3)公共组件
全局组件的使用:
Vue.component('全局组件的名字', {
跟new Vue()实例化对象中的options是一样,但要注意:
不管是公共组件还是局部组件,data必须是个函数,函数一定要有返回值
})
5. v-model
表单输入绑定
单向绑定:把Model绑定到View上,当我们用JavaScript代码更新Model时,View就会自动更新
双向绑定:如果用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。
v-model指令在表单及
6.过滤器
可以自定义过滤器,用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和v-bind表达式。过滤器应该被添加在JavaScript表达式的尾部,由“管道”符号指示:
{{ message | capitalize}}
{{ price | currentPrice }}
{{ msg | reverse }}
7. 侦听属性之watch
Vue停工了一种通用的方式来观察和响应Vue实例上的数据变动:侦听属性
{{myName}}
8. 计算属性
计算属性默认值只有getter方法
{{ desc }}
音乐播放器的实现:
-
{{ song.id }} -- 歌名:{{ song.name}}
歌手:{{ song.author }}
9. 选项/生命周期钩子
所有的生命周期钩子自动绑定this上下文到实例中,因此可以访问数据,对属性和方法进行运算。这意味着不能使用箭头函数来定义一个生命周期方法。这是因为箭头函数绑定了父上下文,因此this与期待的Vue实例不同,this.fetchTodos的行为未定义。
10. $ref获取DOM元素
11. 使用$nextTick的特殊情况
获取更新之后的dom添加事件
四. Vue进阶
1. 前端路由的实现
前端路由:
下载vue-router: npm install vue-router --save
(1)引入vue-router的模块,默认会抛出一个VueRouter对象
(2)Vue.use(VueRouter)
(3)创建路由对象
(4)路由对象挂在到Vue实例当中
2. Vue-router的基本使用
3. 命名路由的使用
4. 路由参数param和query的使用
路由范式:
xxx.html#/user/1 params
// 配置路由对象中
{
path: '/user/:id',
componenet: User
}
xxx.html#/user?userId=1 query
{
path: '/user',
}
5. 编程式导航
6. 嵌套路由的使用
一个router-view嵌套另外一个router-view
7. 动态路由匹配
8. keep-alive在路由中的使用
9. 权限控制
10. Axios
Axios是一个基于promise的HTTP库,可以用在浏览器和node.js中
1)axios的get请求
// 为给定ID的user创建请求
axios.get('/user?ID=123')
.then(function(response){
console.log(response);
})
.catch(function(error){
console.log(error);
});
2)axios的post请求
axios.post('/user', {
firstName: "Josh",
lastName: "Howard"
})
.then(function(response){
console.log(response);
})
.catch(function(error){
console.log(error);
});
3)axios的GET和POST请求实例
4)axios的URL默认匹配1
11. webpack
对前端中的资源(html、css、js、png、mp3等)进行编译打包,支持模块化es6的module
webpack中有很多loader
1)css-loader; style-loader
module.exports = {
entry: {
"main": "./main.js"
},
output: {
filename: "./bundle.js"
},
watch: true,
// 模块中的loader
module:{
loaders:[
{
test: /\.css$/,
loader: 'style-loader!css-loader'
}
]
}
2)vue-loader
12. 前端脚手架
安装vue-cli:npm install -g @vue/cli
vue init <模板> <项目名>,例如:vue init webpack-simple my-project
模板:webpack-simple 简单的配置webpack的模板
vue init webpack webpack_project
13. vuex
Vuex是一个专为Vue.js应用程序开发的状态管理模式
下载npm install vuex -S
1) index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.Store({
// 五大将 state mutation action getter module
state:{
count:1
},
mutations:{
// 修改状态 更改 Vuex 的 store 中的状态state的唯一方法是提交(commit) mutation
// 方法
// 只能做同步操作 不能 直接commit
// 同步
addCount(state,val){
state.count+=val;
},
// 同步
asyncHandler(state,val){
state.count+=val;
}
},
actions:{
// Action 类似于 mutation,不同在于:
// Action 提交 mutation,而不是直接变更状态。
// Action 可以包含任意异步操作。
asyncHandler({commit},val){
commit('asyncHandler',val)
},
addCount({commit},val){
setTimeout(()=>{
commit('addCount',val)
},2000)
}
}
});
export default store;
2) main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import store from './store'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
store,
components: { App },
template: ' '
})
3) HelloWorld.vue
{{myCount}}
4) child.vue
{{myCount}}