Vue快速入门教程

目录

Vue在2017年人气一路上涨,越来越多的项目选用Vue.js进行开发,这与Vue本身的轻量、容易学习有很大的关系。并且可预测Vue这种的发展态势还将持续上涨。所以作为一个前端开发者来说,也应该学习学习这门技术让自己不掉队。

在经过一段时间自己的学习实践,分享关于自己的理解,可以让更多准备学习Vue的人可以快速入门少走些弯路。

以下将从几方面介绍Vue,了解完这几方面你对Vue就大概有一个骨架认识,再去学习就会容易得多。
- Vue是什么及其特点
- vue的生命周期
- vue的响应式原理
- 网络请求axios
- 路由router
- 状态管理vuex


Vue是什么及其特点

一、Vue.js是一套构建用户界面的渐进式框架,也就是说你可以根据需要引入,不会在初始化就引入很多内容,简单轻量。

二、 Vue是MVVM(Model,View,ViewModel)模型的框架。

三、Vue对应用使用组件化进行构建,组件小型,可复用,可以让我们的代码更加方便管理。

四、 Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。
在底层的实现上, Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。

实例的生命周期

每个vue实例在被创建前都需要经过一系列的初始化过程,例如需要设置数据监听、编译模板、挂载实例到 DOM、在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,给予用户机会在一些特定的场景下添加他们自己的代码。
理解vue的生命周期可以帮助我们在实际中进行开发。

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8">
    <script src="http://unpkg.com/vue/dist/vue.js"></script>
    <script type="text/javascript">
        window.onload = function(){
            new Vue({
                el:'#box',
                data:{
                    msg:'welcome'
                },
                created:function(){
                    console.log('实例已经创建,msg变量还未渲染到模板')
                },
                mounted:function(){
                    console.log('已经挂载到模板上:msg变量渲染到模板')  
                },
                updated:function(){
                    console.log('实例更新啦')    
                },
                destroyed:function(){
                    console.log('销毁啦')  
                }
            });
        }
    </script>
</head>
<body> 
    <div id="box">
        <input type="text" v-model="msg"><br/>
        {{msg}}
    </div>
</body>
</html>

vue的响应式原理

响应原理图
说到Vue的特性就不得不说它的响应式系统了。
数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。这使得状态管理非常简单直接,不过理解其工作原理同样重要,这样你可以回避一些常见的问题。

如何追踪变化?

当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。
用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。
每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。

网络请求axios

vue2.0之后,就不再对vue-resource更新,而是推荐使用axios。在Vue中可以通过Axios进行网络请请求。
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

功能特性: 
-从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据-
- 客户端支持防御 XSRF

更详细的请右转->axios的使用及中文说明

路由router

为什么需要用到router(路由)呢?
在vue中,我们是通过组件来组成应用程序的,我们需要控制页面的跳转呢?这时候vue-router就发挥作用了。

当你要把 vue-router 添加进来,我们需要做的是,将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。

route的两个主要标签有2个:
默认会被渲染成一个 <a> 标签,所以我们可以用它来导航链接到哪个页面;
用于将页面(组件)渲染到标签里
如下:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- 使用 router-link 组件来导航. -->
    <!-- 通过传入 `to` 属性指定链接. -->
    <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的组件将渲染在这里 -->
  <router-view></router-view>
</div>

路由的使用我们需要配置,将组件映射到路由。

// 0. 如果使用模块化机制编程,導入Vue和VueRouter,要调用 Vue.use(VueRouter)

// 1. 定义(路由)组件。
// 可以从其他文件 import 进来
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }

// 2. 定义路由
// 每个路由应该映射一个组件。 其中"component" 可以是
// 通过 Vue.extend() 创建的组件构造器,
// 或者,只是一个组件配置对象。
// 我们晚点再讨论嵌套路由。
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

// 3. 创建 router 实例,然后传 `routes` 配置
// 你还可以传别的配置参数, 不过先这么简单着吧。
const router = new VueRouter({
  routes // (缩写)相当于 routes: routes
})

// 4. 创建和挂载根实例。
// 记得要通过 router 配置参数注入路由,
// 从而让整个应用都有路由功能
const app = new Vue({
  router
}).$mount('#app')

// 现在,应用已经启动了!

通过注入路由,我们可以用 this.$router 来访问它,router中记录了路径的跳转可以帮助我们进行页面跳转导航。

vue-router的官方文档

状态管理vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态。
每一个 Vuex 应用的核心就是 store(仓库)

可以把它理解成类似一个全局的存储对象。但是,Vuex 和单纯的全局对象有以下两点不同:
1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
2. 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。
举个例子:

//-----main.js start--------
import vuex from 'vuex'
import store from './store'
···
Vue.use(vuex)
···

new Vue({
  el: '#app',
  router,
  store,//将store挂载到根节点,把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件,且子组件能通过 this.$store 访问到
  components: { App },
  template: '<App/>'
})
//-----main.js end--------

//-----store.js start--------
import Vue from 'vue'
import Vuex from 'vuex'
// import Axios from 'axios'

Vue.use(Vuex)
const store = new Vuex.Store({
    //state对象存放全部的应用层级状态
  state: {
    unreadNews: []
  },
  //用来从 store 获取 Vue 组件数据
  getters: {
    unreadNews: state => state.unreadNews
  },
  //Mutators:事件处理器用来驱动状态的变化, mutation处理同步事务
  mutations: {
    addunreadNews (state, newData) {
      state.unreadNews.push(newData)
    },
    clearunreadNew (state) {
      state.unreadNews = [];
      console.log('清除数据clearunreadNew' + state.unreadNews)
    }
  }
  //action用于执行异步操作
  actions: {

  }
})
export default store
//-----store.js  end--------

//在组件中可以通过使用this.$store.state中获取应用的状态
<span class="newNum">[{{this.$store.state.unreadNews.length}}]</span>

//在组件中可以调用store.commit 方法,通过this.$store.commit('functionname',arg)修改store中的state,那么当我们变更状态时,监视状态的 Vue 组件也会自动更新
methods:{
        changeUnReadyNews(){
          console.log('清除数据'+JSON.stringify(this.newmovicelist))
          this.$store.commit('clearunreadNew')
        }
      }

参考资料汇总:
vue中文文档
vuex中文文档
vue-router中文文档
Axios中文说明
vue2.0源码分析之理解响应式架构

Logo

前往低代码交流专区

更多推荐