2021-06-17 VUE全面总结【基础篇】(第一次整理)(一)

简介: 2021-06-17 VUE全面总结【基础篇】(第一次整理)

第一章 初入vue


基于vue2

之前是用的原生js+css+html写代码,顶多再用个jQuery,想发送请求用js原生xml,要不就是利用jQuery的ajax等第三方。写法是一个页面一个HTML文件,每一个页面引入自己需要的js、css、第三方库等。页面之间的跳转大多用的是window.location.href = '/XXXX.html'。这种模式叫MVC模式。

01 初始vue


vue代码的写法和之前是迥然不同的。最大的特点是只有一个页面。利用数据驱动视图(MVVM),双向绑定。 开发方式是利用vue脚手架工程化开发。它的作用是可以使开发效率提高,可以处理更加复杂的业务逻辑,更好的拥抱未来。

02 vue的由来


vue是渐进式javascript框架 。根据vue的特点,列出他的原理,这篇文章就不写了,有兴趣可以去百度Vue源码系列-Vue中文社区

变化侦测篇

学习Vue中如何实现数据的响应式系统,从而达到数据驱动视图。

虚拟 DOM 篇

学习什么是虚拟 DOM,以及Vue中的DOM-Diff原理

模板编译篇

学习Vue内部是怎么把template模板编译成虚拟DOM,从而渲染出真实DOM

实例方法篇

学习Vue中所有实例方法(即所有以$开头的方法)的实现原理

全局 API 篇

学习Vue中所有全局API的实现原理

生命周期篇

学习Vue中组件的生命周期实现原理

指令篇

学习Vue中所有指令的实现原理

过滤器篇

学习Vue中所有过滤器的实现原理

内置组件篇

学习Vue中内置组件的实现原理

03 使用vue怎么开发?


之前我开发项目是那么写,现在用vue到底该怎么做才能和之前开发出一样的效果,甚至比之前更好呢?

第二章 vue这个工具的使用


正所谓。知己知彼,我得先知道vue是怎么用才可以谈怎么做项目,下面会将vue功能进行分类 。

01 插值表达式|胡子语法


里面可以写一写简单逻辑  语法{{  }}  

02 指令


image.png

image.png

image.png

image.png

03过滤器


是什么: 转换格式, 过滤器就是一个函数, 传入值返回处理后的值

使用:

  • Vue.filter("过滤器名", (值) => {return "返回处理后的值"}) =》全局写在main.js中最好,全局组件都可以用
  • filters: {过滤器名字: (值) => {return "返回处理后的值"}=》局部
  • 模板中使用
import Vue from "vue";
Vue.filter("toUp", (val) => { // 2. 全局过滤器: 到处使用=>全局注册在main.js中注册, 一处注册到处使用
  return val.toUpperCase();
});

04 计算属性computed


一个数据, 依赖另外一些数据计算而来的结果

其实也是变量,只不过是对变量计算后的变量,可以v-for计算属性名

简写 (只可读):

语法:computed: {
    "计算属性变量名" () {
        return "值"
    }
}

完整写法(可读写):

computed: {
    "属性名": {
        set(值){
        },
        get() {
            return "值"
        }
    }
}

计算属性也是vue数据变量, 所以不要和data里重名, 用法和data相同

注意:上面的是简写,只能读,不可以修改。完整写法可以读写

应用:如计算总价和均价  

04-1 监听属性-watch


可以监听data/computed等属性值改变


用法:

watch: {
     "被监听的属性名" (newVal, oldVal){
         当变量的值发生改变就会触发这里的函数,然后做事
     }
 }

05.组件


一个页面, 可以拆分成一个个组件,一个组件就是一个整体, 每个组件可以有自己独立的 结构 样式 和 行为(html, css和js)

封装的思想,把页面上 可重用的部分 封装为 组件,从而方便项目的 开发 和 维护

使用:全局:

import 组件对象 from 'vue文件路径'

Vue.component("组件名", 组件对象)

在任何组件中只要写入<组件名>组件名>就可以使用组件

局部:1.引入  2 components里注册 3 使用<组件名 />

注意点:1. scoped作用解决多个组件样式名相同, 冲突问题  类似于函数作用域

2./deep/深度作用选择符  父组件控制子组件的样式(style都加了scoped属性情况)

06组件通信


遵循单向数据流:父变子变,子不可直接改父,可通过修改引用地址方式改父

因为每个组件的变量和值都是独立的, 如果想获取对方页面中定义的变量应该怎么做?

1.父传子  父:在<子的组件名>上使用  :自定义的名字   子:props接收

2子传父  父: @自定义事件名="父methods函数"   子: this.$emit("自定义事件名", 传值)

3. 事件总线跨组件:1.定义

// 1. 创建事件总线   main.js
const bus = new Vue()
// 把bus挂载到了Vue的原型上, 保证所有的组件都能通过 this.$bus访问到事件总线
Vue.prototype.$bus = bus

2 页面使用

// 2. 订阅事件 - 接收值                          要接收的
this.$bus.$on('事件名', 事件回调函数)
this.$bus.$on('send', msg => {
})
// 1. 在created中订阅
// 2. 回调函数需要写成箭头函数
// 3. 发布事件 - 传递值                     要往外传
this.$bus.$emit('事件名', 额外参数)
this.$bus.$emit('send', 'hello')

07 生命周期


定义: 一个组件从 创建 到 销毁 的整个过程就是生命周期  

作用:在特定的时间,执行某些特定的操作

<template>
  <div>
    <ul id="myUl">
      <li v-for="(item, ind) in arr" :key="ind">{{ item }}</li>
    </ul>
    <button
      @click="
        () => {
          arr.push(Math.random() * 10);
        }
      "
    >
      增加一个元素
    </button>
  </div>
</template>
<script>
export default {
  data () {
    return {
      msg: "我是变量",
      arr: [1, 2, 3, 4],
      isShow: true,
    }
  },
  beforeCreate () {
    // 1. 创建前
    console.log("beforeCreate --- 实例初始化前")
    console.log(this.msg) // undefined
  },
  created () {
    // 2. 创建后=> 发送ajax请求
    console.log("created ---  实例初始化后")
    console.log(this.msg) // "我是变量"
  },
  beforeMount () {
    // 3. 挂载前
    console.log("beforeMount --- vue的虚拟DOM, 挂载到真实的网页之前")
    console.log(document.getElementById("myUl")) // null
    // console.log(document.getElementById("myUl").children[1].innerHTML) // 报错
  },
  mounted () {
    // 4. 挂载后=》操作dom
    console.log("mounted --- vue的虚拟DOM, 挂载到真实的网页上 ")
    // console.log(document.getElementById("myUl").children[1].innerHTML)
    console.log(document.querySelector('#myUl').children[1].innerText)
  },
  beforeUpdate () {
    // 5. 更新前
    console.log("beforeUpdate --- 数据更新, 页面更新前")
    // 比如点击新增数组元素, vue会触发此生命周期函数, 但是此时页面并未更新, 所以获取不到新增的li标签
    // console.log(document.getElementById("myUl").children[4].innerHTML) // 报错
  },
  updated () {
    // 6. 更新后
    console.log("updated --- 数据更新, 页面更新后")
    console.log(document.getElementById("myUl").children[4].innerHTML)
  },
  beforeDestroy () {
    // 7. 销毁前
     // (清除定时器 / 解绑js定义的事件)
    console.log("beforeDestroy --- 实例销毁之前调用")
  },
  destroyed () {
    // 8. 销毁后
    // (清除定时器 / 解绑js定义的事件)
    console.log("destroyed --- 销毁完成")
  },
};
</script>
<style>
</style>

我的理解: 创建后,也就是create钩子函数的时候,已经有数据了(实例对象data),但是没有挂载(el)第三个狗子,beforemount 已经有虚拟DOM了,但是没渲染,直到mount第四钩子函数才渲染了,销毁前这个钩子,dom还在,解除事件和dom绑定,销毁这个钩子DOM才销毁。注意:第一次页面加载,会触发前面4 个钩子函数,DOM渲染在第四步,最早发起ajax在create 钩子函数里

08 axios  


是什么: 是一个专门用于发送ajax请求的库。底层还是原生js实现,内部通过promise封装的

使用: 里面的then 是一个异步,微任务

// 1. 导入axios
import axios from 'axios'
// 2. 使用
axios({
  method: '请求方式', // get post
  url: '请求地址',
  data: {    // 拼接到请求体的参数,  post请求的参数
    xxx: xxx,
  },
  params: {  // 拼接到请求url的参数, get请求的参数
    xxx: xxx 
  }
}).then(res => {
  console.log(res.data) // 后台返回的结果
}).catch(err => {
  console.log(err) // 后台报错返回
})

实际工作中,会对axios进行封装。因为用的比较频繁。 具体封装新开一帖。

相关文章
|
3天前
|
存储 JavaScript
vue页面跳转取消上一个页面请求
本文介绍了在Vue中如何取消上一个页面的请求,以避免页面跳转时请求未完成导致的数据错误。核心方法是使用axios的请求拦截器设置请求的取消令牌(cancelToken),并在vuex中存储这些取消令牌的引用。当进行路由跳转时,通过路由守卫清除这些请求,达到取消上一个页面请求的目的。
19 2
|
2天前
|
JavaScript
Vue使用element中table组件实现单选一行
如何在Vue中使用Element UI的table组件实现单选一行的功能。
16 5
Vue使用element中table组件实现单选一行
|
2天前
|
JavaScript
Vue实现按钮级别权限
文章介绍了在Vue中实现按钮级别权限的两种方法:使用自定义Vue指令和使用v-if指令配合自定义方法。
12 4
Vue实现按钮级别权限
|
1天前
|
缓存 JavaScript 前端开发
vue-day02计算属性,v-bind,v-if,v-for
文章介绍了Vue.js中的计算属性、class与style的绑定、条件渲染和列表渲染的使用。通过示例代码展示了如何使用计算属性简化模板逻辑、如何通过v-bind动态绑定class和style、如何使用v-if进行条件渲染以及如何使用v-for进行列表渲染。这些特性使得Vue.js在构建动态用户界面时更加灵活和强大。
vue-day02计算属性,v-bind,v-if,v-for
|
1天前
|
JavaScript
vue项目中使用vue-router进行路由配置及嵌套多级路由
该文章详细说明了如何在Vue项目中配置和使用vue-router进行单页面应用的路由管理,包括设置嵌套路由和实现多级路由导航的示例。
vue项目中使用vue-router进行路由配置及嵌套多级路由
|
2天前
|
JavaScript
Vue+element_Table树形数据与懒加载报错Error in render: “RangeError: Maximum call stack size exceeded“
本文讨论了在使用Vue和Element UI实现树形数据和懒加载时遇到的“Maximum call stack size exceeded”错误,指出问题的原因通常是因为数据中的唯一标识符`id`不唯一,导致递归渲染造成调用栈溢出。
10 1
Vue+element_Table树形数据与懒加载报错Error in render: “RangeError: Maximum call stack size exceeded“
|
1天前
|
JavaScript
vue项目中引入阿里图标iconfont
该文章指导如何在Vue项目中引入并使用阿里图标库Iconfont,包括图标的选取、下载配置文件及在项目中引入和使用图标的具体步骤。
|
3天前
|
JavaScript
vue知识点
vue知识点
13 4
|
1天前
|
JavaScript 网络架构
|
1天前
|
JavaScript 前端开发 Java
vue-day03 组件基础
文章介绍了Vue.js中组件的基础概念、注册格式、命名方式、全局与局部注册的区别、prop属性的详细使用以及通过prop向子组件传递数据的方法,并提供了计数器和博文小组件的实例。