目录
Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名:
Vue3.0也提供了Composition API形式的生命周期钩子,与Vue2.x中钩子对应关系如下:
beforeCreate===> setup()
created=======> setup()
beforeMount ===> onBeforeMount
mounted=======> onMounted
beforeUpdate ===> onBeforeUpdate
updated =======> onUpdated
beforeUnmount===>onBeforeUnmount
unmounted======> onUnmounted
- import{reactive,onMounted,onBeforeUnmount} from 'vue'
- export default function (){
- //实现鼠标“打点”相关的数据
- let point=reactive({
- x:0,
- y:0
- })
- //实现鼠标“打点”相关的方法
- function savePoint(event){
- point.x=event.pageX
- point.y=event.pageY
- console.log(event.pageX,event.pageY)
- }
- //实现鼠标“打点”相关的生命周期钩子
- onMounted(()=>{
- window.addEventListener('click',savePoint)
- })
- onBeforeUnmount(() => {
- window.removeEventListener('click',savePoint)
- })
-
- return point
- }
-
- import{ref} from 'vue'
- import usePoint from '../hooks/usePoint'
- export default {
- name:'Demo',
- setup(){
- let sum=ref(0)
- let point=usePoint()
- return{sum,point}
- }
- }
- import { ref, reactive, toRef, toRefs } from 'vue'
- export default {
- name: ' Demo ',
- setup() {
- //数据
- let person = reactive({
- name: '张三',
- age: 18,
- job: {
- j1: {
- salary: 20
- }
- }
- })
-
- return {
- person,
- //不能用ref(person.name),因为他不会改变person,而是把person.name的值复制了
-
- //name:toRef(person,'name),
- //age:toRef(person,'age'),
- //salary:toRef(person.job.j1,'salary'),
- ...toRefs(person)//在一个对象中展开另一个对象的数据
- }
- }
- }
- let person = reactive({name:'张三',
- age:18,
- job:{
- j1:{
- salary: 20}
- }})
- function showRawPerson(){
- const p = toRaw(person)
- console.log(P)
- }
- <div>
- <input type="text" v-model="keyWord">
- <h3>{{keyWord}}h3>
- div>
- template>
- <script>
- import {ref,customRef}from 'vue'
-
- export default {
- name:' App' ,
- setup() {
- //自定义一个ref-名为: myRef
- function myRef(value,delay){
- let timer
- return customRef((track,trigger)=>{
- return{
- get(){
- console.log(`有人从myRef这个容器中读取数据了,我把${value}给他了`)
- track()//通知Vue追踪value的变化(提前和get商量一下,让他认为这个value是有用的)
- return value
- },
- set(newValue){
- console.log(`有人从myRef这个容器中改变数据了:${newValue}`)
- clearTimeout(timer)
- timer=setTimeout(()=>{
- value=newValue
- trigger()//通知vue重新解析模板
- },delay)
- }
- }
- })
- }
- // let keyWord = ref('hello') //使用Vue提供的ref
- let keyWord = myRef('hello',500) //使用程序员自定义的ref
- return{keyWord}
- }
- }
- script>
-
-
-
- 祖组件
- import {reactive,toRefs,provide} from 'vue'
- import Child from './components/Child.vue'
- export default {
- name: 'App',
- components:{Child},
- setup(){
- let car=reactive({name:'奔驰',price:'40W'})
- provide('car',car)//给自己后代组件传递数据
- return{...toRefs(car)}
- }
- }
-
- <div class="son">
- <h3>我是Son组件(孙),{{car.name}}-{{car.price}}h3>
- div>
- <script>
- import {inject}from 'vue'
- export default {
- name:'Son',
- setup(){
- let car=inject('car')
- }
- }
- script>
使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改。
我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。
什么是Teleport? ——Teleport是一种能够将我们的组件html结构移动到指定位置的技术。
-
'body'> - <div v-if="isShow" class="mask">
- <div class="dialog">
- <h3>我是一个列窗h3>
- <h4>一些内容h4>
- <h4> 一些内容h4>
- <h4>一些内容h4>
- <button @click="isShow = false">关闭弹窗button>
- div>
- div>
- import {defineAsyncComponent} from 'vue'
- const Child = defineAsyncComponent(()=>import( ' ./components/Child.vue'))
- 使用Suspense包裹组件,并配置好default 与fallback
- <div class="app">
- <h3>我是App组件h3><Suspense>
- <template v-slot:default>
- <Child/>
- template>
- <template v-slot:fallback>
- <h3>加载中.....h3>template>
- Suspense>div>
- 也会出现等一等的效果
- async setup(){
- let sum = ref(0)
- let p = new Promise((resolve,reject)=>{
- setTimeout(()=>{
- resolve({sum})
- },3000)
- }
- return await p}
Vue 2.x有许多全局API和配置。
- //注册全局组件
- vue. component( ' MyButton ' ,{
- data: () =>({
- count: 0
- }),
- template: ''})
- //注册全局指令
- Vue.directive( 'focus ',
- {inserted: el =>el.focus()}
Vue3.0中对这些API做出了调整:
Vue2.x写法
.v-enter,.v-leave-to {opacity: 0;}
.v-leave,.v-enter-to {opacity: 1;}
Vue3.x写法
.v-enter-from,.v-leave-to {opacity: 0;}
.v-leave-from,.v-enter-to iopacity: 1;}
- v-on:close="handleComponentEvent"v-on:click="handleNativeclickEvent"/>
- 子组件中声明自定义事件
- export default {
- emits: ['close']}
- 移除过滤器(filter)
过滤器虽然这看起来很方便,但它需要一个自定义语法,打破大括号内表达式是“只是JavaScript”的假设,这不仅有学习成本,而且有实现成本!建议用方法调用或计算属性去替换过滤器。