【美团网项目】2.Vue基础知识

知识点

  • 环境搭建(如何快速搭建 Vue 环境 / 创建一个 Vue 项目)
  • 模板语法
  • 计算属性
  • 类与样式
  • 条件&列表渲染
  • 事件处理
  • 深入了解组件
  • 路由基础(单页面应用会涉及到路由,如何配置路由)
  • Vuex基础(跨组件通信、状态保护都依赖于 Vuex)

环境搭建

搭建环境有很多种方式,这里我们采用最快速最便捷的脚手架(构建工具 vue-cli)方式,这个脚手架是 vue 官方提供的。

  • vue-cli@3(vue 脚手架,当前版本是3,是 vue 的一个构建工具)
  • [email protected](vue 语法,当前使用的是2.5版本)

vue 脚手架指的是 vue-cli,它是一个专门为单页面应用快速搭建繁杂的脚手架,它可以轻松的创建新的应用程序而且可用于自动生成 vue 和 webpack 的项目模板。

1. 安装 vue-cli 构建工具(-g 表示全局安装)

$ npm install -g @vue/cli
# 或
$ yarn global add @vue/cli

# 查看安装的版本
$ vue -V

2. 创建一个 Vue 项目:使用 vue-cli 脚手架快速创建

# 基于交互式命令行的方式创建新版 vue 项目
$ vue create vue-demo
# 或
# 基于图形化界面的方式创建新版 vue 项目
$ vue ui

【补充说明】:使用 npm install -g @vue/cli 命令进行安装,如果在Mac上报如下错误:

# MacOS,安装npm全局包提示没有写入权限:
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules

解决方法:
修改npm包所安装目录的权限:sudo chown -R $USER /usr/local 然后输入密码就可以了
查看目录是否已切换权限:ls -l /usr/local

3. 编译、运行 vue 项目

# 进入项目目录
$ cd vue-demo
# 编译项目
$ npm run serve
  • 编译成功如下:
 DONE  Compiled successfully in 2878ms                         4:00:54 ├F10: PM┤

  App running at:
  - Local:   http://localhost:8080/ 
  - Network: http://192.168.1.121:8080/

  Note that the development build is not optimized.
  To create a production build, run npm run build.

复制上面的网址到浏览器即可预览项目运行的效果~

模板语法

  • 插值(文本赋值)

{{ msg }}



{{ msg }}

内容

关于v-html:你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。

  • 绑定属性指令 v-bind:属性名



  • 绑定事件指令 v-on:事件名



计算属性

  • 对于任何复杂逻辑,你都应当使用计算属性,可以解决响应式依赖问题。
  • 应用场景:具有依赖关系的数据监听。

{{ message }}

翻转字符串: "{{ reversedMessage }}"

{{ fullName }}
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Hello',
    firstName: 'Foo',
    lastName: 'Bar'
  },
  // 计算属性
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    },
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

类与样式

  • 动态切换样式

我是一个很长很长的标题!!!

我是一个很长很长的标题!!!

我是一个很长很长的标题!!!

我是一个很长很长的标题!!!

我是一个很长很长的标题!!!

我是一个很长很长的标题!!!

data: {
  isActive: true,
  error: null
},
computed: {
  // 计算属性:当 isActive 或者 hasError 变化时,class 列表将相应地更新。
  classObject: function () {
    return {
      active: this.isActive && !this.error,
      'text-danger': this.error && this.error.type === 'fatal'
    }
  }
}

条件&列表渲染

  • 条件渲染 v-if


这是用v-if控制的元素

这是用v-show控制的元素

  • 列表渲染 v-for

{{ item }}

索引值:{{ i }} , 每一项的值:{{ item.name }}

事件处理















深入了解组件

组件:模板(必须的,且仅有一个根节点) + script + 样式(如:HelloWorld.vue







  • props:组件之间的参数传递(父组件向子组件传参,单向的)

  • slot:插槽在组件抽象设计中的应用。我们在定义组件时,可以在组件中放一个插槽,插槽在将来可以放任意的不确定的子组件(即可以通过插槽动态往组件中添加内容),从而提高组件的灵活性和复用性。



... ...



  • 自定义事件:父子组件的通信方式(可以解决子组件向父组件传递参数)








export 的作用,与 export default 的区别:

一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用 export 关键字输出该变量。

export 的作用:向外暴露对象。export命令对外输出了指定名字的变量(变量也可以是函数或类)。

exportexport default 的区别:

//【export 的使用】:在一个模块中,export、import可以有多个(都需要加大括号),import时要注意变量名(可以取别名)与export时保持一致。
// profile.js
var name = 'zhangsan';
var age = 28;
var func = function() {};
export {name, age, func};

// 对应的导入方式
import { name } from './profile.js';
// 可以使用as关键字,将输入的变量重命名。
import { myName as name } from './profile.js';
// 导入多个
import { name, age, func } from './profile.js';


//【export default 的使用】:在一个模块中,export default、import仅有一个(都不需要加大括号),import时变量名可以取任意名字。
// profile.js
var name = 'zhangsan';
export default name;

// 对应的导入方式
import customName from './profile.js';

路由基础

vue-router的实现原理:路由不同的页面也就是加载不同的组件。

路由的三个基本概念:

  • route:一条路由,如:{ path: '/', component: PageA }
  • routes:一组路由,如:[{ path: '/', component: PageA }, { path: '/pageb', component: PageB }]
  • router:管理路由,一个机制,想当于一个管理者。
  • 客户端中的路由:dom元素显示或隐藏,基于hash和基于HTML5 history api。

vue-router中的路由基于以上4点实现:在vue中我们所有的内容都是组件化的,所有只需要把路径和组件对应起来,然后在组件中把页面渲染出来就可以了。

安装 vue-router:

$ npm install vue-router

页面实现:
在vue-router中,由两个标签来对应点击和显示部分; 就是定义页面中点击的部分, 定义显示部分,就是在点击后匹配的内容显示在什么地方;还有一个非常重要的属性to,定义点击之后跳到哪里去。

路由的使用:在src目录下再新建一个 router.js 定义 router

/// -------------------- router.js --------------------
import Vue from 'vue'
import VueRouter from 'vue-router'
// 1. 导入(路由)组件
import PageA from './pages/a.vue'
import PageB from './pages/b.vue'

// 如果使用模块化机制编程,导入Vue和VueRouter,要调用 Vue.use(VueRouter),把 VueRouter 加进来,才能进行实例化
Vue.use(VueRouter);

// 2. 定义路由(每个路径映射一个组件)
// 首次进入页面的时候,页面没有内容,因为首次进入页面,它的路径是'/',我们并没有给这个路径做相应的配置,我们要把这个路径指向PageA,用redirect来定义重定向:
const routes = [
    {
        path: "/pagea",
        component: PageA
    },
    {
        path: "/pageb",
        component: PageB
    },
    {
        path: '/',
        redirect: '/pagea'
    }
];

// 3.路由的实例化(最后再将路由的实例和app实例关联)
const router = new VueRouter({
    routes // (缩写) 相当于 routes: routes
});

export default router;

4.把 router 实例注入到vue根实例中,开始使用

import Vue from 'vue'
import App from './App.vue'

// 引入路由
import router from "./router.js"
new Vue({
  el: '#app',
  router,  // 注入到根实例中
  render: h => h(App)
})

5.最后要在 App.vue 中 添加 (将路由匹配到的组件渲染到页面中去)




补充:this.$router.push("pagea") 也可以实现路由跳转。

执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/pagea', component:PageA} path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 标签所在的地方。所有的这些实现才是基于hash 实现的。

执行流程:项目加载的过程是index.html -> main.js -> app.vue -> index.js -> xxx.vue,如果main.js里面有钩子,会先走钩子。

Vuex基础

vuex是专门用来管理vue.js应用程序中状态(这里所说的状态指的是vue组件中data里面的属性)的一个插件。他的作用是将应用中的所有状态都放在一起,集中式来管理。

把组件的共享状态抽取出来,以一个全局单例模式管理。任何组件都能获取状态或者触发行为。

Vuex 是专门为 Vue.js 设计的状态管理库,以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新。

组件之间的传值:

  • 父组件传子组件:通过子组件的 props 属性
  • 子组件传父组件:通过自定义事件发送消息,传递参数
  • 跨组件传递数据:多个组件之间公用一份数据

安装 Vuex

$ npm install vuex

VueX中的核心内容:
在VueX对象中,其实不止有 state,还有用来操作 state 中数据的方法集,以及当我们需要对 state 中的数据需要加工的方法集等等成员。

成员列表:

  • state 存放状态
  • getters 加工state成员给外界
  • mutations state成员操作
  • actions 异步操作
  • modules 模块化状态管理
/// -------------------- store.js --------------------
import Vue from 'vue'
import Vuex from 'vuex';

// 加载插件
Vue.use(Vuex);

// 1.定义 state (数据部分,相当于组件中的data;数据变化后,会重新渲染到组件中)
const state = {
    count: 1
}

// 2.定义 mutations,在内部对数据进行操作(即修改state中的数据)
const mutations = {
    // 执行这个函数的时候对 count 加 1
    increment(state) {
        state.count++;
    },
    // 执行这个函数的时候对 count 减 1
    decrement(state) {
        state.count--;
    }
}

// 3.定义 actions (actions 是用来接收 vue组件 中的用户行为 dispatch,进一步去触发要做的 commit,通过 commit 来告诉 mutations 要执行哪个操作做数据修改)
const actions = {
    increment: ({ commit }) => {
        // 参数是 mutations 中的函数名
        commit('increment');
    },
    decrement: ({ commit }) => {
        commit('decrement');
    }
}

const store = new Vuex.Store({
    state,       // 存放状态
    // getters,  // state的计算属性(加工state成员给外界)
    mutations,   // 更改state中状态的逻辑,同步操作(state成员操作)
    actions      // 提交mutation,异步操作
    // mudules   // 将store模块化
})

// es6模块导出
export default store;


// 4.注入到 Vue 根实例中
/*
    new Vue({
        store,      // 在根节点注入 store
        render: h => h(App),    // 渲染 App.vue 页面,作为启动页
    }).$mount('#app')
*/

5.在组件中读取或操作 vuex(store.js)中的数据







你可能感兴趣的:(【美团网项目】2.Vue基础知识)