• 总结vue 需要掌握的知识点



    使用的开发工具是webstorm,它是默认就安装好了vuejs插件,idea要使用的话,需要安装一下该插件


    一、快速搭建项目vue-cli 脚手架(Vue2.0)

    1、Vue CLI使用前提 –Node、 Webpack

    (1) 安装 nodejs并通过npm 安装 cnpm:

    https://www.cnblogs.com/shan333/p/15726428.html

    (2) 安装webpack(全局安装):

    # 不写版本号,默认是安装最新的版本号
    cnpm install webpack@3.6.0 -g   或    npm install webpack@3.6.0 -g
    

    (3) 安装vue脚手架(vue-cli 版本是3.xx):

    # 不写版本号,默认是安装最新的版本号
    cnpm install @vue/cli -g        或    npm install @vue/cli -g
    

    ● 通过拉取模板就可以使用2.x版本(vue-cli2、vue-cli3任你选):

    npm install -g @vue/cli-init 或 cnpm install -g @vue/cli-init
    

    ■ 本地安装与全局安装区别:

    • 本地安装:仅将webpack安装在当前项目的node_modules目录中,仅对当前项目有效。
    • 全局安装:将webpack安装在本机,对所有项目有效,全局安装会锁定一个webpack版本,该版本可能不适用某个项目。全局安装需要添加 -g 参数。



    2、初始化Vue-cli2项目、Vue-cli3项目:

    • 初始化Vue-cli2项目:
    vue init webpack my-project
    
    • 初始化Vue-cli3项目:
    vue create my-project
    
    runtime-compiler 和 runtime-only的选择:选 runtime-only

    ■ Vue-cli2项目、Vue-cli3项目区别:

    仅仅只是vue-cli3会把node_modules 隐藏起来。

    开发好项目,上传代码时node_modules 是不用上传上去的,只需要在readme提醒别人通过 npm install 命令即可在目录创建node_modules。



    3、启动项目:

    • 启动项目前先打包,再启动:
    # 打包命令
    npm run build
    
    • Vue-cli2项目:
    npm run dev
    
    • Vue-cli3项目:
    npm run serve
    




    二、vue的浏览器调试插件 vue-devtools

    • 像普通插件一样安装到浏览器即可




    三、vue 的基本使用

    ■ 最简单的例子:

    
    
    
      
      Title
      
    
    
        
    
    {{message}}
    样式
    折叠

    1、插值表达式 {{ }}

    • 将值插入到我们模板的内容当中

    2、双向绑定绑定 v-model

    3、v-if 条件选择

    • v-else

    • v-show 适合经常切换的

    4、v-for 循环

    5、样式绑定

    6、属性绑定

    • v-bind 常用的是语法糖的冒号:

    7、事件绑定

    • v-on 常用的是语法糖的@,经常使用的也是点击事件@click

    • 事件修饰符

    8、计算属性

    • 和普通methods 属性的区别是:它具有缓存作用

    9、插槽slot

    在vue中看到$:代表使用但是是vue自身的属性或者是挂载到vue上的插件(比如route)的属性,目的是为了和咱自己定义的变量做一个区分

    安装插件命令:npm install (若失败,可以使用cnpm install)

    # npm install --save 插件名
    # 安装路由
    npm install vue-router --save
    # 安装vuex
    npm install vuex --save
    
    # 安装element-ui
    npm i element-ui -S
    
    # npm install
    # 安装axios
    npm install axios
    
    • --save-dev 的话,安装到node_modules 目录中,并在devDependencies 节点下添加上依赖,-dev是在开发时需要用的,部署不需要,一般是一些打包压缩工具和一些格式转化工具




    四、组件

    1、什么是组件化

    Vue的组件化设计思想借鉴了Java的面向对象思想。Java认为万物皆对象,在Vue中,万物皆组件。

    也就是说,在实际的vue项目中,以及使用了Vue框架的项目中,Vue的对象都会以组件的形式出现,能被反复使用。

    要想实现组件化,需要在页面中注册组件。

    关于注册的方式有两种,分别是全局注册和本地注册


    2、注册

    全局注册和本地注册区别:

    全局注册可以在任何Vue根实例里面使用;而本地(局部)注册只能在绑定它的父组件中使用。

    一般项目中只有一个Vue根实例(全局注册),其他组件都是局部注册的。

    • 全局注册:
    • 本地(局部)组件

    3、模板占位符 template

    (1) template 用于包裹元素,template 不会被渲染到页面上

    template:每个组件文件中的根template,也就是最外层的template 只能有一个根元素,可以是div,也可以是其他元素。

    组件模板只能有一个根元素(通常是一个div)!

    非根template没有限制,可以有多个。

    template用于创建单文件组件,实际上是一种原子化的设计,可以一次定义,然后在任何地方生成dom,如果有多个子元素,就违背了这种原子设计,也就是说,一个template就只会渲染一个子组件树。

    vue在动态创建dom的时候,会将template中的子元素作为入口进行创建,根据这个入口,遍历以该子元素作为根节点的整个节点树,然后创建虚拟dom。

    如果template有多个子元素,那么vue就无法获取确切入口。


    (2) template作用:

    通过template,vue文件实现了结构的分层 html视图层、css样式层、js层

    • 举例 Home.vue 文件:
    
    
    
    
    
    
    折叠



    4、组件的生命周期

    (1) 钩子函数

    Vue中的组件是有生命周期的。每个生命阶段会有相应的生命周期钩子函数被调用。

    在vue中分为8个阶段:创建前/后,载入前/后,更新前/后,销毁前/后。


    (2) Vue生命周期函数使用场景

    • beforeCreate (使用频率低)
      * 在实例创建以前调用
      * 没有实例化,数据访问不到

    created (使用频率高) 初始化数据

    此时状态:Vue里的数据在内存中已经创建完毕,但是还没有渲染到页面上。
    可做操作:从服务器获取一些初始化的数据,或者通过ajax向服务器发送一些数据。

    进行ajax请求异步数据的获取(发送请求,访问后端接口拿数据),初始化数据

    * 实例被创建完成后调用

    * 能拿到数据,能修改数据,

    * 且修改数据不会触发updated beforeUpdate钩子函数

    * 可以在这个钩子函数里发请求,访问后端接口拿数据

    * 判断是否存在el,是否存在template,如果二者都有,以template为主优先, 如果 没有template,会选择el模板。
    如果二者都没有,有$mount 也可以调用模板

    • beforeMount(载入前)

      * 编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。

      * 真实的dom节点挂载到页面之前
      * 编译模板已经结束,虚拟dom已经存在
      * 可以访问数据,也可以更改数据
      * 且修改数据不会触发updated beforeUpdate钩子函数

    mounted(载入后)获取dom节点、修改更新数据

    此时状态: 数据已经渲染在了浏览器的页面上。
    可做操作:操作DOM节点

    可以对挂载元素的dom节点进行获取,也可以访问后端接口拿数据,修改更新数据,触发更新钩子函数

    * 真实的dom节点挂载到页面以后

    
    
    
    
    var value = this.$refs.aa.innerText
    

    * 可以访问和更改数据
    * 且修改数据会触发更新钩子函数

    • beforeUpdate(更新前)

    * 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。

    • updated(更新后)

    * 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。

    * 然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。

    beforeDestroy(销毁前)移除定时器或者移除事件绑定

    此时状态:奄奄一息。
    可做操作:移除定时器或者移除事件绑定。但是销毁的时候需要手动销毁.

    • destroyed(销毁后)

    * 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。


    (3) 总结 Vue 生命周期常用的构子函数以及其他常用函数

    created (使用频率高) 初始化数据

    进行ajax请求异步数据的获取(发送请求,访问后端接口拿数据),初始化数据

    mounted(载入后)获取dom节点、修改更新数据

    可以对挂载元素的dom节点进行获取,也可以访问后端接口拿数据,修改更新数据,触发更新钩子函数

    updated

    任何数据的更新,如果要做统一的业务逻辑处理

    nextTick

    针对单一事件更新数据后立即操作dom

    • 由于Vue的异步更新策略导致我们对数据的修改不会立马体现到都没变化上,此时如果想要立即获取更新后的dom的状态,就需要使用nextTick方法

    watch

    监听数据变化,并做相应的处理



    5、父组件和子组件(组件通信)

    (1) 父组件向子组件传参---通过props 声明属性

    在子组件(当前组件)中通过props声明属性,然后调用者(父组件)可以设置属性。

    • 子组件 Header.vue
    
    
    
    
    • 父组件 App.vue
    
    
    
    

    (2) 子组件向父组件传参---一般是通过emit 自定义事件传参

    ▪ emit方式【事件传参】:是通过emit自定义了一个事件,发送事件的同时传递参数;然后父组件监听自定义事件,回调函数获取到参数

    ▪ props方式【回调传参】:是通过在props声明函数类型的属性,然后在子组件上监听事件回调传递参数,再在父组件设置属性,属性值是回调函数,此时回调函数获取到参数。


    ■ 事件传参:通过emit 自定义事件,然后在父组件监听自定义事件,然后回调函数获取参数
    • 子组件 Header.vue
    
    
    
    
    • 父组件 App.vue
    
    
    
    

    ■ 通过props 声明属性是函数类型,然后子组件监听事件,回调传参;父组件设置属性,属性值是回调函数,在回调函数获取子组件传递的参数
    • 子组件 Header.vue
    
    
    
    
    • 父组件 App.vue
    
    
    
    

    父子组件通信(父子组件的参数传递)是属于在同一个页面的参数传递。和路由传参不同,路由传参是通过url的参数进行传参,在不同页面的参数传递。



    第三方插件:vue-route、vuex、axios、element-ui 在vue中使用思路:

    1、通过npm istall 插件名 命令添加到node_modules,并添加到dependencies依赖下(在package.json 可以看到)

    2、(第三方的东西一般会创建一个文件进行封装) 创建插件对象,然后导出

    • 通过Vue的use方法安装插件

    3、在项目的main.js 中引入插件对象,然后挂载到vue实例对象

    对于element-ui 样式布局插件,不用抽离单独封装成一个文件,直接在项目的mian.js 中使用Vue的use方法安装插件,然后就可以直接使用了,不用挂载到Vue实例上。




    五、vue-route

    1、引入路由模块并使用

    • 路由对象
    // 1. 定义路由组件.
    // 也可以从其他文件导入
    const Home = { template: '
    Home
    '
    } const About = { template: '
    About
    '
    } // 2. 定义一些路由 // 每个路由都需要映射到一个组件。 // 我们后面再讨论嵌套路由。 const routes = [ { path: '/', component: Home }, { path: '/about', component: About }, ] // 3. 创建路由实例并传递 `routes` 配置 // 你可以在这里输入更多的配置,但我们在这里 // 暂时保持简单 const router = VueRouter.createRouter({ // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。 history: VueRouter.createWebHashHistory(), routes, // `routes: routes` 的缩写 }) export default router
    • 在main.js 中引入路由模块并使用(挂载路由)
    import Vue from 'vue'
    import App from './App'
    
    import router from './router'
    new Vue({
      el: '#app',
      router,//使用路由模块
      template: '',
      components: { App }
    })
    
    • 路由体验:
    
    
    
    
    • 改变url,发现<router-view></router-view>中的内容发生改变

    http://localhost:8080/#/ 显示home

    http://localhost:8080/about 显示About

    • 向router实例中添加mode属性:路由的两种模式

      值"hash":url带#适用于调试模式

      值"history":url不带#


    2、路由传参

    (1) 通过 params 获取参数的方式[动态路由]

    ① 路由path中声明参数

    的to属性传参

    ③ 在模块组件中接收参数 $route.params

    // 路由path中声明参数,用于接收route-link 中传来的参数
    const routes = [
      // 动态字段以冒号开始
      { path: '/about/:id', component: User },
    ]
    
    
    
    
    
    
    
    
    
    
        
    

    (2) 通过 quary 获取参数的方式

    的to属性传参

    ② 在模块组件中接收参数 $route.query

    
    
     
    
    
     
    
    
    
    
      
    

    • to可以接收一个对象,对象的属性有parmas,也有query
    
    

    ■ 补充一个常识,浏览器你看到地址url,其实是包括 path,和查询条件query

    http://localhost:8080/about/123?name=shan&age=18

    path:/about/123

    query:是指从?开始的查看条件 ?name=shan&age=18,多个查询条件使用&隔开(除了第一个查询条件使用?)


    4、总结路由传参 parmas 和 query

    • 传递参数主要有两种类型: params 和 query
    • 主要是写法格式不同,query是传统的传参方式,以?开始,而params(path 传参方式),其实是一种restful风格的传参方式[写法更整齐简洁]
    • 两者传参方式没有好坏之分
    • 需要注意的是params需要预定义声明参数,即在路由配置中定义 用冒号的形式标记




    六、axios

    1、axios 是什么?

    Axios 是一个基于 Promise 的 HTTP 库(网络请求库),可以作用于浏览器和 node.js

    2、安装(npm安装方式):

    npm install axios
    

    3、 axios网络模块过程:

    (1)axios创建实例(全局配置/基本配置

    (2) 发送请求

    (3) axios拦截器的使用

    import axios from 'axios'
     
    export function request(config) {
      // 1.创建axios的实例(全局配置/基本配置)
      const service = axios.create({
        baseURL: 'http://123.207.32.32:8000',//还可以将baseURL的值抽取出去 baseURL: process.env.BASE_API,
        timeout: 5000
      })
     
      // 2.axios的拦截器
      // 2.1.请求拦截的作用
      service.interceptors.request.use(config => {
        // console.log(config);
        // 1.比如config中的一些信息不符合服务器的要求
     
        // 2.比如每次发送网络请求时, 都希望在界面中显示一个请求的图标
     
        // 3.某些网络请求(比如登录(token)), 必须携带一些特殊的信息
        return config
      }, err => {
        // console.log(err);
      })
     
      // 2.2.响应拦截
      service.interceptors.response.use(res => {
        // console.log(res);
        return res.data
      }, err => {
        console.log(err);
      })
     
      // 3.发送真正的网络请求
      return service(config)
    }
    
    折叠
    • 针对模块组件封装成具体方法发送请求:
    // article.js 
    import request from '@/request'
    
    export function getHotArtices() {
      return request({
        url: '/articles/hot',
        method: 'post'
      })
    }
    
    export function viewArticle(id) {
      return request({
        url: `/articles/view/${id}`,
        method: 'post'
      })
    }
    .....
    




    七、Vuex状态管理

    • 后端对应的web是使用session管理状态
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    
    // 定义状态对象state,保存数据的仓库
    const state={
        //组件模块调用state中的属性:this.$store.state.getUserInfo
        userInfo:{
            id:'',
            name:''
        }
    }
    //相对于java对象的get方法
    const getters={
        //组件模块调用getter中的方法:this.$store.getters.getUserInfo
        getUserInfo(state){
            return state.userInfo;
        }
    }
    //相当于java的set方法的mutations(同步执行)和 actions(异步执行)
    const mutations ={
        //组件模块调用mutations中的方法:this.$store.commit('updateUserInfo', userInfo) 通过提交commit
        updateUserInfo(state, userInfo){
            state.userInfo = userInfo;
        }
    }
    const actions ={
        //组件模块调用actions中的方法:this.$store.dispatch('asyncUpdateUserInfo', userInfo) 通过分发dispatch
        asyncUpdateUserInfo(context, userInfo){
            context.commit('updateUserInfo', userInfo);//最终还是调用同步的mutations中的方法
        }
    }
    
    export default new Vuex({
        state,
        getters,
        mutations,
        actions
    });
    
    折叠




    八、element-ui

    • element-ui 和 bootstrap类似,都是做为样式组件的

    1、引入 Element(完整引入)

    • 在 main.js 中写入以下内容
    import Vue from 'vue';
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import App from './App.vue';
    
    Vue.use(ElementUI);
    
    new Vue({
      el: '#app',
      render: h => h(App)
    });
    

    2、Layout 布局

    • 需要什么组件就直接从官网提供的布局组件那里复制




    如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

  • 相关阅读:
    Python 中的模糊字符串匹配
    如何全面提升架构设计的质量
    初识C++ · 类和对象(中)(2)
    【每日一题】151. 反转字符串中的单词
    Linux中getopt函数、optind等变量使用详解
    记录Apple MFI开发获取TOKEN全过程
    Spring Boot整合Redis实现缓存(实战详细)
    数据结构第三遍补充(图的应用)
    安全性和合规性:保障企业数据的安全
    网络设备远程登录和管理-双厂商
  • 原文地址:https://www.cnblogs.com/shan333/p/16483946.html