一、安装脚手架

1、下载node.js,本文下载版本为node-v8.12.0-x64.msi,一键式安装。

2、安装完成后,打开终端,输入node,可进入node环境(两次ctrl+c退出),如下图:

3、查看版本,如下图:

4、在成功安装node.js(即能够成功查看版本如上图)的前提下,再安装淘宝npm(http://npm.taobao.org/),命令如下:

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

  执行结果如下:

5、安装脚手架

  依次执行下面两条命令:

1
npm install -g @vue/cli
1
npm install -g @vue/cli-init              // 注释:这是拉取cli版本2的命令

  CLI3版本的文档:https://cli.vuejs.org/zh/guide/

  CLI2版本的文档:https://github.com/vuejs/vue-cli/tree/v2#vue-cli--

6、执行完毕后输入vue -V验证是否成功,如下图:

二、过滤器

1、过滤器分为局部过滤器和全局过滤器,定义和使用如下:

<div id="app">
<App />
</div> <script>
// 定义全局过滤器(任意组件都可以使用)
Vue.filter('myTime', function (val, formatStr) {
return moment(val).format(formatStr)
});
let App = {
data(){
return {
msg: "hello world",
time: new Date()
}
},
// 在template中使用过滤器
template:`
<div>
<h3>我是一个APP</h3>
<p>局部过滤器{{ msg | myReverse }}</p>
<p>全局过滤器{{ time | myTime('YYYY-MM-DD') }}</p>
</div>
`,
// 定义局部过滤器(只能在本组件内使用)
filters:{
myReverse:function (val) {
return val.split('').reverse().join('')
}
}
}; new Vue({
el: "#app",
data(){
return { }
},
components:{
App
}
});
</script>

  总结:

    1)局部过滤器:在当前组件内部使用;

    2)全局过滤器:只要过滤器一创建,在任何组件中都能使用;

    3)过滤器其实就是给某些数据“添油加醋”;

    4)上面示例用到了moment.js(一个处理时间的类库:http://momentjs.cn/)中moment方法;

三、生命周期的钩子函数

  每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

  我们可以在官方文档的API 的选项/生命周期钩子看到有如下生命周期钩子函数:

<div id="app">
<App></App> <!-- 使用局部组件App -->
</div> <script>
// 声明一个局部组件Test
let Test = {
data(){
return {
msg: "原数据",
count: 0,
timer: null
}
},
template:`
<div id="test">
<div id="box">{{ msg }}</div>
<p>定时器{{ count }}</p>
<button @click="change">修改</button>
</div>
`,
methods:{
change(){
this.msg = '修改后的数据';
// 查询选择器,获取id=box的元素
document.querySelector('#box').style.color='red';
}
},
beforeCreate(){
// 组件创建之前,获取不到数据属性
console.log(this.msg); // undefined
},
created(){
// 在该组件实例创建完成后被立即调用,可以获取数据属性,重要
// 数据观测 (data observer),属性和方法的运算,watch/event 事件回调
// 然而,挂载阶段还没开始,$el 属性目前不可见
// created中可以操作数据,可实现vue==》页面(即数据驱动视图)的影响
// 应用:发送ajax请求
console.log(this.msg);
// this.msg = '嘿嘿黑';
// 开一个定时器,在destroyed中销毁
this.timer = setInterval(()=>{
this.count++;
},1000);
},
beforeMount(){
// 挂载数据到DOM之前会调用,无法获取到该组件DOM
console.log(document.getElementById('app'));
},
mounted(){
// 这个地方可以操作DOM,重要
// 但是能用数据驱动完成的就不要做DOM操作
// 挂载数据到DOM之后会调用,可以获取到真实存在的DOM元素
console.log(document.getElementById('app'));
},
beforeUpdate(){
// 数据更新时调用,发生在虚拟 DOM 打补丁之前
// 应用:获取更新之前的DOM
console.log(document.getElementById('app').innerHTML);
},
updated(){
// 由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子
// 应用:获取最新的DOM
console.log(document.getElementById('app').innerHTML);
},
beforeDestroy(){
// 实例销毁之前调用。在这一步,实例仍然完全可用
console.log('beforeDestroy');
},
destroyed(){
// Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,
// 所有的事件监听器会被移除,所有的子实例也会被销毁
// 应用:清定时器(定时器有开就要清,占内存)
// created中开定时器,destroyed中消定时器
console.log('destroyed');
clearInterval(this.timer);
console.log('------', this.timer)
},
// 创建和销毁比较消耗性能,可以用激活(activated)和停用(deactivated)
// 激活和停用要借助vue的内置组件keep-alive组件
// 它能让当前组件放在keep-alive中缓存起来
activated(){
// keep-alive 组件激活时调用
console.log('组件被激活了');
},
deactivated(){
// keep-alive 组件停用时调用
console.log('组件被停用了');
}
};
// 声明一个局部组件App
let App = {
data(){
return {
isShow:true
}
},
template:`
<div class="app">
<keep-alive>
<Test v-if="isShow"></Test>
</keep-alive>
<button @click="clickHandler">改变test组件的生死</button>
</div>
`,
methods:{
// 演示beforeDestroy和destroyed方法的事件
clickHandler(){
this.isShow = !this.isShow
}
},
components:{
Test
}
};
// Vue实例对象,根组件,可以没有template属性,直接在el中使用子组件
new Vue({
el: '#app',
data() {
return {}
},
components:{
App // 挂载局部组件App
}
})
</script>

  总结(created和mounted是重点):

    created:发送ajax,获取数据,实现数据驱动视图;

    mounted:获取真实DOM;

    activated:激活当前组件;

    deactivated:停用当前组件,依赖vue提供的内置组件,主要作用是让组件产生缓存;

    destroyed:如果开了定时器,可在此函数中关闭定时器;

四、VUE的全家桶 (vue + vue-router + vuex)

  vue + vue-router主要来做SPA(Single Page Application),即单页面应用。

  vue-router是vue的核心插件,它要依赖vue。

  为什么要使用单页面应用?

  因为传统的路由跳转,如果后端资源过多,会导致页面出现白屏现象,让前端来做路由,在某个生命周期的钩子函数中发送ajax,数据驱动视图。为了用户体验。

  单页面应用的网站有路飞学城、稀土掘金(https://juejin.im),和网易云音乐。

五、vue-router的基本使用

  Vue Router是Vue.js的官方路由器。它与Vue.js核心深度集成,使用Vue.js构建单页应用程序变得轻而易举。

  注意:如果使用模块化机制编程,导入Vue和VueRouter,要调用 Vue.use(VueRouter),相当于给Vue的原型上挂载了一个属性。

1、vue-router基本使用

<div id="app"></div>
<!-- 先引入vue.js,再引入vue-router.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script>
// 创建Home组件
const Home = {
data(){
return {}
},
template: `<div>我是首页</div>`
};
// 创建Course组件
const Course = {
data(){
return {}
},
template: `<div>我是免费课程</div>`
};
// 创建路由
const router = new VueRouter({
// 定义路由规则
routes: [
{
path: '/',
redirect: '/home' // 重定向
},
{
path: '/home',
component: Home
},
{
path: '/course',
component: Course
}
]
});
// 声明一个组件App
let App = {
data(){
return {}
},
// router-link和router-view是vue-router提供的两个全局组件
// router-link会渲染成a标签,to属性会被渲染成href属性
// router-view是路由组件的出口,就是组件内容会被渲染到router-view中
template:`
<div class="app">
<div class="header">
<router-link to='/'>首页</router-link>
<router-link to='/course'>免费课程</router-link>
</div>
<router-view></router-view>
</div>
`
};
// Vue实例对象
new Vue({
el: '#app',
router, // 使用router属性挂载router,相当于router:router
data() {
return {}
},
template:`<App></App>`,
components:{
App // 挂载组件App
}
})
</script>

2、命名路由

  有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。如下:

// 创建路由
const router = new VueRouter({
// 定义路由规则
routes: [
{
path: '/',
redirect: '/home' // 重定向
},
{
path: '/home',
name: 'home',
component: Home
},
{
path: '/course',
name: 'course',
component: Course
}
]
});

要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象,如下:

<router-link :to='{name:"home"}'>首页</router-link>
<router-link :to='{name:"course"}'>免费课程</router-link>

3、动态路由

<div id="app"></div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script>
// 创建User组件
const User = {
data(){
return {
user_id: null
}
},
template: `<div>我是用户{{ user_id }}</div>`,
// 通过注入路由器,我们可以在任何组件内
// 通过 this.$router 访问路由器,也可以通过 this.$route 访问当前路由
// 注意,当使用路由参数时,如从/user/1到/user/2原来的组件实例会被复用
// 因为两个路由都渲染一个组件,比起销毁再创建,复用则显得更加高效
// 不过,这也意味着组件的生命周期钩子不会再被调用
// 所以在/user/1与/user/2 切换时,created方法只调用一次,即只打印一次
created(){
console.log(this.$route); // 路由信息对象
console.log(this.$router); // 路由对象VueRouter
},
// 复用组件时,想对路由参数的变化作出响应的话,你可以用 watch (监测变化) 检听$route 对象
watch: {
'$route'(to, from) {
console.log(to);
console.log(from);
// 模拟修改数据
this.user_id = to.params.id;
// 实际中可以发送ajax
}
}
};
// 创建路由
const router = new VueRouter({
// 定义路由规则
routes: [
{
path: '/user/:id', // 例:/user/2
name: 'user',
component: User
}
]
});
// 声明一个组件App
let App = {
data(){
return {}
},
// router-link和router-view是vue-router提供的两个全局组件
// router-link会渲染成a标签,to属性会被渲染成href属性
// router-view是路由组件的出口,就是组件内容会被渲染到router-view中
template:`
<div class="app">
<div class="header">
<router-link :to='{name:"user", params:{id:1}}'>
用户1
</router-link>
<router-link :to='{name:"user", params:{id:2}}'>
用户2
</router-link>
</div>
<router-view></router-view>
</div>
`
};
// Vue实例对象
new Vue({
el: '#app',
router, // 使用router属性挂载router,相当于router:router
data() {
return {}
},
template:`<App></App>`,
components:{
App // 挂载组件App
}
})
</script>

  示例中$route对象在从控制台输出结果如下:

4、编程式导航vs声明式导航  

  除了使用<router-link>创建 a 标签来定义导航链接(声明式导航),我们还可以借助 router 的实例方法,通过编写代码来实现(编程式导航)。如下:

<div id="app"></div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script>
// 创建User组件
const User = {
data(){
return {
user_id: null
}
},
template: `<div>
<p>我是用户{{ user_id }}</p>
<button @click="clickHandler">跳转首页</button>
</div>
`,
methods:{
// 编程式导航
clickHandler(){
this.$router.push({
name:"home"
})
}
}
};
// 创建Home组件
const Home = {
data(){
return {}
},
template:`
<div>我是首页</div>
`
};
// 创建路由
const router = new VueRouter({
// 定义路由规则
routes: [
{
path: '/user/:id',
name: 'user',
component: User
},
{
path: '/home',
name: 'home',
component: Home
}
]
});
// 声明一个组件App
let App = {
data(){
return {}
},
// 下面使用router-link创建a标签是声明式导航
template:`
<div class="app">
<div class="header">
<router-link :to='{name:"user", params:{id:1}}'>
用户1
</router-link>
<router-link :to='{name:"user", params:{id:2}}'>
用户2
</router-link>
</div>
<router-view></router-view>
</div>
`
};
// Vue实例对象
new Vue({
el: '#app',
router, // 使用router属性挂载router,相当于router:router
data() {
return {}
},
template:`<App></App>`,
components:{
App // 挂载组件App
}
})
</script>

5、注意

  组件中的函数写在methods属性中,created等属性中也可以定义函数,我们有时候可以将在created中执行的方法定义在methods中,在created中执行。

Vue 3 --安装脚手架、过滤器、生命周期的钩子函数、vue-router基本使用的更多相关文章

  1. vue学习(五)生命周期 的钩子函数

    生命周期的钩子函数 主要有以下几种 beforeCreate created beforeMount mounted beforeUpdate updated activated deactivate ...

  2. [前端] VUE基础 (5) (过滤器、生命周期、钩子函数)

    一.过滤器 过滤器分为局部过滤器和全局过滤器. 1.局部过滤器 <body> <div id="app"> </div> <script ...

  3. Vue(3)- 安装脚手架、过滤器、生命周期的钩子函数、vue-router基本使用

    一.安装脚手架 1.下载node.js,本文下载版本为node-v8.12.0-x64.msi,一键式安装. 2.安装完成后,打开终端,输入node,可进入node环境(两次ctrl+c退出),如下图 ...

  4. vue-cli脚手架 ,过滤器,生命周期钩子函数

    一.安装vue-cli脚手架 1.淘宝镜像下载 用淘宝的国内服务器来向国外的服务器请求,我们向淘宝请求,而不是由我们直接向国外的服务器请求,会大大提升请求速度,使用时,将所有的npm命令换成cnpm即 ...

  5. vue学习之生命周期和钩子函数

    参考文章:Vue2.0 探索之路——生命周期和钩子函数的一些理解 抛出问题: 我们有时候会在几个钩子函数里做一些事情,那么什么时候做,该在哪个函数里做? 生命周期简介 结合代码看el 和 data以及 ...

  6. vue生命周期、钩子函数

    https://segmentfault.com/a/1190000011381906    详解生命周期和钩子函数 每个vue实例再被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期 ...

  7. vue教程2-01 vue生命周期、钩子函数

    vue教程2-01 vue生命周期.钩子函数 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. Vue – 基础学习(1):对生命周期和钩子函的理解

    一.简介 先贴一下官网对生命周期/钩子函数的说明(先贴为敬):所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周 ...

  9. vue学习笔记(二)vue的生命周期和钩子函数

    前言 通过上一章的学习,我们已经初步的了解了vue到底是什么东西,可以干什么,而这一篇博客主要介绍vue的生命周期和它常用的钩子函数,如果有学过java的园友可能有接触到在学习servlet的时候学过 ...

随机推荐

  1. ACM学习历程—广东工业大学2016校赛决赛-网络赛E 积木积水(最值问题 || 动态规划)

    题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=4 这个题目自然会考虑到去讨论最长或者最短的板子. 笔上大概模拟一下的话,就 ...

  2. python实现redis三种cas事务操作

    cas全称是compare and set,是一种典型的事务操作. 简单的说,事务就是为了存取数据库中同一数据时不破坏操作的隔离性和原子性,从而保证数据的一致性. 一般数据库,比如MySql是如何保证 ...

  3. 查找图像中椭圆轮廓的快速随机hough变换

    查找图像中椭圆轮廓的快速随机hough变换 图像中椭圆轮廓的查找在视频监控等领域有着广泛的应用,经典hough变换给我们提供了一种查找各种图形轮廓的方法,特别是在直线查找方面具有非常高的精确度.但是由 ...

  4. Parallel Programming-Parallel.Invoke

    本文主要介绍Parallel.Invoke的使用. 一.使用例子 class ParallelInvoke { public void Action1() { Thread.Sleep(); Cons ...

  5. 笔者带你剖析轻量级Sharding中间件——Kratos1.x

    之所以编写Kratos其实存在一个小插曲,当笔者满山遍野寻找成熟.稳定.高性能的Sharding中间件时,确实是翻山越岭,只不过始终没有找到一款合适笔者项目场景的中间件产品.依稀记得当年第一款使用的S ...

  6. 杂项-权限管理:RBAC

    ylbtech-杂项-权限管理:RBAC 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中, ...

  7. linux日常管理-free查看内存工具

    查看内存 命令 free  默认是k为单位 也可以指定 m为单位 或者G为单位,这个不精准 total 总容量 used  使用了多少 free  剩余多少 看第二行.第一行是物理内存,加上虚拟内存b ...

  8. centos6.5安装tomcat7.0教程(二)

    阅读之前对基本命不熟悉的话, 可以先安装另一文章: http://www.cnblogs.com/duenboa/articles/6665159.html把基本的命令记一下.后面的文章就不重复演示了 ...

  9. Animations使用01 BrowserAnimationsModule

    1 基础知识 1.1 动画 就是从一个状态过渡到另外一个状态 1.2 状态 元素本身的形状.颜色.大小等 1.3 Angular中的动画 给元素添加一个触发器,当这个触发器被触发后就会让该元素的状态发 ...

  10. 报错:Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): cn.itcast.bos.domain.base.SubArea

    因为 实体类中的主键 是String类型 不能自动为其分配id  所以需要手动设置在service层   model.setId(UUID.randomUUID().toString());