• Vue-(7)


    内容概览

    • vue3介绍
    • 创建vue3项目的两种方式
    • setup函数
    • ref与reactive
    • 计算属性和监听属性
    • 生命周期
    • hooks
    • toRefs

    vue3介绍

    1.性能的提升
        打包大小减少41%
        初次渲染快55%, 更新渲染快133%
        内存减少54%
    2.源码的升级
        使用Proxy代替defineProperty实现响应式
        重写虚拟DOM的实现和Tree-Shaking
    3.拥抱TypeScript
        Vue3可以更好的支持TypeScript
    4.新的特性
        Composition API(组合API)
            setup配置
            ref与reactive
            watch与watchEffect
            provide与inject
        新的内置组件
            Fragment
            Teleport
            Suspense
        其他改变
            新的生命周期钩子
            data 选项应始终被声明为一个函数
            移除keyCode支持作为 v-on 的修饰符
    
    5 组合式API和配置项API
    	-使用组合式API
        -配置项API
        	-{
                name:'xx',
                data:function(){},
                methods:{}
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    创建vue3项目的两种方式

    """vue-cli:创建vue2和vue3"""   
    	跟之前一样
    """vite:创建vue3"""
    	# 创建最新版本
    		npm init vue@latest
    	    # Pinai,Vue 的存储库,它可以跨组件/页面共享状态(与vuex功能类似)
    	# vite创建另一种方式:创建vue3.0.4版本
    	    npm init vite-app <project-name>
    	    ## 进入工程目录
    	    cd <project-name>
    	    ## 安装依赖
    	    npm install
    	    ## 运行
    	    npm run dev
        
    """以后再页面中的this,已经不是vue2中的vc对象了,是一个代理对象"""
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    setup函数

    # vue新增的setup配置项函数
    在里边可以定义变量、定义函数
    变量与函数需要return出去才能够在模板中使用
    
    • 1
    • 2
    • 3
    <template>
      
      <h2>{{ name }}h2>
      <h2>{{ age }}h2>
      <button @click="handleClick">点击弹窗button>
      <button @click="handleAdd">点击age+1button>
      
      <children aaa="aaa">children>
    template>
    
    
    <script>
    import Children from "./components/Children.vue";
    
    export default {
      name: 'App',
      components: {Children},
      setup() {
        /*以后所有的变量定义函数编写,都写在这个函数中
        * 如果直接这么写变量血染没有问题,但是没有响应式,变量改变了页面不会变*/
        let name = 'xxx'
        let age = 20
    
        // 定义函数
        function handleClick() {
          alert('---')
        }
    
        let handleAdd = () => {
          age++
          console.log(age)  // 打印的一直在增加,但是显示的不会改变
        }
        // 必须要返回给外界
        return {name, age, handleClick, handleAdd}
      }
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    Children组件:

    <template>
      <h1>Childrenh1>
    template>
    
    <script>
    export default {
      name: "Children",
      props: ['aaa'],
      setup(context) {
        // setup中没有this了,通过第一个参数(上下文)获取
        console.log(context)  // Proxy {aaa: 'AAA'}
      }
    
    }
    script>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ref与reactive

    # 导入使用: import {ref, reactive} from 'vue'
    # 基本数据类型(数字,字符串,布尔)如果要加响应式,使用ref包裹;模板中直接使用,js中通过对象.value获取
    # 对象/数组如果要加响应式,使用reactive
    # ref也可以包裹对象
    
    • 1
    • 2
    • 3
    • 4
    <template>
      <h2>{{ age }}h2>
      <h2>{{ hobby }}h2>
      <button @click="handleAdd">点击age+1button>
      <button @click="handleDef">点击删除爱好button>
    template>
    
    
    <script>
    import {ref, reactive} from "vue";
    
    export default {
      name: 'App',
      components: {},
      setup() {
        // let age = 20
        // let hobby = ['读书', '跑步', '篮球']
        let age = ref(20)
        let hobby = reactive(['读书', '跑步', '篮球'])
        console.log(age)  // age已经不是数字了,是RefImpl的对象
    
        let handleAdd = () => {
          age.value++
          console.log(age.value)
        }
    
        function handleDef() {
          hobby.pop()
          console.log(hobby)
        }
    
        return {age, hobby, handleAdd, handleDef}
      }
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    计算属性与监听属性

    计算属性
    <template>
      <input type="text" v-model="surname">
      <br>
      <input type="text" v-model="name">
      <hr>
      <input type="text" v-model="fullName">
    template>
    
    1. 计算属性案例一
    <script>
    import {ref, computed} from "vue";
    
    export default {
      name: 'App',
      components: {},
      setup() {
        let surname = ref('')
        let name = ref('')
        let fullName = computed(() => {
          return surname.value + name.value  // 返回两个变量相加的值
        })
        return {surname, name, fullName}
      }
    }
    script>
    
    2. 计算属性案例二
    <script>
    import {reactive, computed} from "vue";
    
    export default {
      name: 'App',
      components: {},
      setup() {
        // 计算属性案例二
        let person = reactive({
          surname: '',
          name: ''
        })
        let fullName = computed(() => {
          return person.surname + person.name
        })
        return {person, fullName}
      }
    }
    script>
    
    3. 定义计算属性
    <script>
    import {reactive, computed} from "vue";
    
    export default {
      name: 'App',
      components: {},
      setup() {
        // 计算属性案例二
        let person = reactive({
          surname: '',
          name: ''
        })
        let fullName = computed({
          get() {
            return person.surname + '_' + person.name
          },
          set(value) {  // 当计算属性被修改时触发
            console.log(value)  // value值为修改后的值
            let nameList = value.split('_')
            person.surname = nameList[0]
            person.name = nameList[1]
          }
        })
        return {person, fullName}
    
      }
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    监听属性
    <template>
      <input type="text" v-model="surname">
      <input type="text" v-model="name">
    template>
    
    
    <script>
    import {ref, watch, watchEffect} from "vue";
    
    export default {
      name: 'App',
      components: {},
      setup() {
        // 监听属性
        let surname = ref('')
        let name = ref('')  // 如果没有使用ref不能够被监听
    
        watch(name,(newValue, oldValue)=>{  // 可以接收两个参数
          console.log('name 改变了')
          console.log(newValue);  // 第一个参数是改变后的值
          console.log(oldValue);  // 第二个参数是改变前的值
        })
    
        // vue3 多的watchEffect,只要函数中使用的变量发生变化,它就会触发
        watchEffect(()=>{
          // 只要该函数中使用的变量发生变化,就会触发
          console.log(surname.value)
          console.log(name.value)
          console.log('watchEffect配置的回调执行了')
        })
        return {surname, name}
    
      }
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    生命周期

    # Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名:
            beforeDestroy改名为 beforeUnmount
            destroyed改名为 unmounted
    # Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下:
            beforeCreate===>setup()
            created=======>setup()
            beforeMount ===>onBeforeMount
            mounted=======>onMounted
            beforeUpdate===>onBeforeUpdate
            updated =======>onUpdated
            beforeUnmount ==>onBeforeUnmount
            unmounted =====>onUnmounted
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    hooks

    # 什么是hook?—— 
    本质是一个函数,把setup函数中使用的Composition API进行了封装。
    类似于vue2.x中的mixin。
    自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂
    
    • 1
    • 2
    • 3
    • 4
    获取鼠标点击坐标案例
    • hooks/usePoint.js
    import {onMounted, onUnmounted, reactive} from 'vue'
    
    export default function () {
        let p = reactive({
            x: 0,
            y: 0
        })
    
        function getPoint(event) {
            console.log(event)  // 在event中获取点击坐标
            p.x = event.pageX
            p.y = event.pageY
        }
    
        // 生命周期钩子的onMounted,当页面挂载完成后执行
        onMounted(() => {
            // 给鼠标点击增加监听,当点击鼠标,就会执行函数
            window.addEventListener('click', getPoint)
        })
        // 当组件被销毁时,把功能去除
        onUnmounted(() => {
            window.removeEventListener('click', getPoint)
        })
        return p
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 在想要使用的组件中引入使用即可
    <template>
      <span>x:{{ p.x }};y:{{ p.y }}span>
    template>
    
    
    <script>
    import UsePoint from "./hooks/usePoint.js";
    
    export default {
      name: 'App',
      components: {},
      setup() {
        let p = UsePoint()
    
        return {p}
    
      }
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    toRefs

    # ...{xxx:yyy}对应python的**{'xxx':'yyy'}
    # setup函数,return{...toRefs(data)}可以解压赋值
    
    • 1
    • 2
    <template>
      <input type="text" v-model="name">
      <br>
      <input type="text" v-model="age">
      <br>
      <input type="text" v-model="gender">
    template>
    
    
    <script>
    
    import {reactive, toRefs, watchEffect} from "vue";
    
    export default {
      name: 'App',
      components: {},
      setup() {
        let data = reactive({
          name: 'xxx',
          age: 20,
          gender: '男'
        })
        watchEffect(() => {
          console.log(data.name)
          console.log(data.age)
          console.log(data.gender)
        })
    
        return {...toRefs(data)}  // 等同于{name:'xxx', age:20, gender:'男'},并且做了响应式
    
      }
    }
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    后台管理模板

    # vue-admin-template-master
    	-package.json 第7行加入
        "dev": "set NODE_OPTIONS=--openssl-legacy-provider & vue-cli-service serve",
    
        
        
    # java版的若依,带权限控制的后台管理模块
    # python :django-vue-admin   
    # python flask-vue-admin
    # go:gin-vue-admin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    【深度学习】损失函数详解
    extern “C“的用法
    mybatis
    ADB 命令大全
    【口罩识别】基于matlab GUI RGB滤波+YCbCr+肤色标定口罩识别【含Matlab源码 1895期】
    Hadoop伪分布模式安装
    VScode常用插件_AE必备插件
    计算机视觉+人工智能面试笔试总结——卷积网络压缩面试题
    VScode + opencv + c++ + win配置教程
    LeetCode_贪心算法_中等_846.一手顺子
  • 原文地址:https://blog.csdn.net/AL_QX/article/details/127656423