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:{}
        }

创建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对象了,是一个代理对象"""

setup函数

# vue新增的setup配置项函数
在里边可以定义变量、定义函数
变量与函数需要return出去才能够在模板中使用
<template>
  <!--vue3中不用在写在template中的一个标签下了-->
  <h2>{{ name }}</h2>
  <h2>{{ age }}</h2>
  <button @click="handleClick">点击弹窗</button>
  <button @click="handleAdd">点击age+1</button>
  <!--通过自定义属性给子组件传值-->
  <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>

Children组件:

<template>
  <h1>Children</h1>
</template>

<script>
export default {
  name: "Children",
  props: ['aaa'],
  setup(context) {
    // setup中没有this了,通过第一个参数(上下文)获取
    console.log(context)  // Proxy {aaa: 'AAA'}
  }

}
</script>

ref与reactive

# 导入使用: import {ref, reactive} from 'vue'
# 基本数据类型(数字,字符串,布尔)如果要加响应式,使用ref包裹;模板中直接使用,js中通过对象.value获取
# 对象/数组如果要加响应式,使用reactive
# ref也可以包裹对象
<template>
  <h2>{{ age }}</h2>
  <h2>{{ hobby }}</h2>
  <button @click="handleAdd">点击age+1</button>
  <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>

计算属性与监听属性

计算属性
<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>
监听属性
<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>

生命周期

# 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

hooks

# 什么是hook?—— 
本质是一个函数,把setup函数中使用的Composition API进行了封装。
类似于vue2.x中的mixin。
自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂
获取鼠标点击坐标案例
  • 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
}
  • 在想要使用的组件中引入使用即可
<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>

toRefs

# ...{xxx:yyy}对应python的**{'xxx':'yyy'}
# setup函数,return{...toRefs(data)}可以解压赋值
<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>

后台管理模板

# 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值