Vue进阶用法4
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项目的两种方式
| |
| -跟之前一样 |
| |
| npm init vue@latest |
| |
| |
| npm init vite-app <project-name> |
| |
| cd <project-name> |
| |
| npm install |
| |
| npm run dev |
| |
| |
| |
| |
| |
setup函数
| |
| -在里面可以定义变量 |
| -定义函数 |
| -必须return 变量和函数,在模板中才能使用 |
| <template> |
| <h2>{{ name }}</h2> |
| <h3>{{ age }}</h3> |
| <button @click="handleClick">点我看美女</button> |
| <br> |
| <button @click="handleAdd">点我,age+1</button> |
| </template> |
| |
| <script> |
| |
| |
| export default { |
| name: 'App', |
| setup() { // setup中没有this了 |
| // 以后所有的变量定义函数编写,都写在这个函数中 |
| // 定义变量 如果这么写,变量渲染没问题,但是没有响应式,页面变了,变量不会变 |
| let age = 19 |
| let name = 'lqz' |
| // 定义函数 |
| function handleClick() { |
| alert('美女~~~') |
| } |
| let handleAdd = () => { |
| console.log('我要开始加了') |
| age=age+1 |
| console.log(age) |
| } |
| // 函数必须有返回值 |
| return { |
| age, name, handleClick, handleAdd |
| } |
| |
| } |
| } |
| </script> |
| |
| |
ref和reactive
| <template> |
| <h2>{{ name }}</h2> |
| <h3>{{ age }}</h3> |
| <br> |
| <button @click="handleAdd">点我,age+1</button> |
| <br> |
| <button @click="handleChangeName">点我name变化</button> |
| </template> |
| |
| <script> |
| |
| import {ref, reactive} from 'vue' |
| |
| export default { |
| name: 'App', |
| setup() { |
| let age = ref(19) // age 已经不是数字了,是RefImpl的对象 |
| let name = ref('lqz') |
| let handleAdd = () => { |
| console.log('我要开始加了,age是', age) |
| age.value = age.value + 1 |
| console.log('我要开始加了,age是', age.value) |
| } |
| function handleChangeName(){ |
| name.value=name.value+'?' |
| console.log(name) |
| } |
| |
| return { |
| age, name, handleClick, handleAdd,handleChangeName |
| } |
| |
| } |
| } |
| </script> |
| |
| |
计算和监听属性
计算属性
| export default { |
| name: 'App', |
| // computed:{ |
| // fullName:function (){} |
| // }, |
| setup() { |
| // 1 计算属性案例1 |
| // let firstName = ref('李') |
| // let lastName = ref('明熠') |
| // // 定义计算属性 |
| // let fullName = computed(() => { |
| // return firstName.value + lastName.value |
| // }) |
| |
| // 2 计算属性案例2 |
| let person = reactive({ |
| firstName: '李', |
| lastName: '明熠', |
| }) |
| // 定义计算属性 |
| person.fullName = computed({ |
| get() { |
| return person.firstName + '-' + person.lastName |
| }, |
| set(value) { |
| console.log(value) |
| const nameArr = value.split('-') |
| person.firstName = nameArr[0] |
| person.lastName = nameArr[1] |
| |
| } |
| }) |
| return { |
| person |
| } |
| |
| |
| } |
| } |
监听属性
| import {computed, watch, ref, reactive, watchEffect} from 'vue' |
| |
| export default { |
| name: 'App', |
| setup() { |
| // 1 计算属性案例1 |
| let name = ref('lqz') |
| |
| // 定义监听属性 |
| watch(name, (newValue, old) => { |
| console.log('name变了') |
| // console.log(old) |
| // console.log(newValue) |
| }) |
| // vue3 多的watchEffect,只要函数中使用的变量发生变化,它就会触发 |
| watchEffect(() => { |
| // 只要该函数中使用的变量发生变化,它就会触发 |
| // let a = name.value + '?' |
| console.log('watchEffect配置的回调执行了') |
| }) |
| return { |
| name |
| } |
| |
| |
| } |
| } |
生命周期
| |
| beforeDestroy改名为 beforeUnmount |
| destroyed改名为 unmounted |
| |
| beforeCreate===>setup() |
| created=======>setup() |
| beforeMount ===>onBeforeMount |
| mounted=======>onMounted |
| beforeUpdate===>onBeforeUpdate |
| updated =======>onUpdated |
| beforeUnmount ==>onBeforeUnmount |
| unmounted =====>onUnmounted |
| |
hooks
| |
| 本质是一个函数,把setup函数中使用的Composition API进行了封装。 |
| 类似于vue2.x中的mixin。 |
| 自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂 |
| |
hook/usePoint.js
| import {onMounted, onUnmounted, reactive} from "vue"; |
| |
| export default function () { |
| let p = reactive({ |
| x: 0, |
| y: 0 |
| }) |
| |
| function getPoint(event) { |
| console.log(event) |
| p.x = event.pageX |
| p.y = event.pageY |
| } |
| |
| |
| onMounted(() => { |
| |
| window.addEventListener('click', getPoint) |
| }) |
| |
| onUnmounted(() => { |
| window.removeEventListener('click', getPoint) |
| }) |
| |
| return p |
| } |
在想使用的组件中引入使用即可
| <template> |
| <h2>x坐标是:{{ p.x }},y坐标是:{{ p.y }}</h2> |
| </template> |
| |
| <script> |
| import {reactive, onMounted, onUnmounted} from 'vue' |
| import usePoint from '../hook/uesPoint.js' |
| |
| export default { |
| name: "Point", |
| setup() { |
| let p = usePoint() |
| return {p} |
| } |
| } |
| |
| </script> |
| |
| <style scoped> |
| |
| </style> |
toRefs
| export default { |
| name: 'App', |
| |
| setup() { |
| let data = reactive({ |
| name: 'lqz', |
| age: 19, |
| isShow: true |
| }) |
| |
| function handleShow() { |
| console.log('ssdaf') |
| data.isShow = !data.isShow |
| data.age++ |
| } |
| |
| return { |
| ...toRefs(data), |
| handleShow |
| // data |
| } |
| |
| } |
| } |
后台管理模板
| |
| -跑起来 |
| -package.json 第7行加入 |
| "dev": "set NODE_OPTIONS=--openssl-legacy-provider & vue-cli-service serve", |
| |
| |
| |
| |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2022-08-01 选课系统前戏