vue3技术简易入门剖析(三)

简介: vue3技术简易入门剖析(三)

vue3技术简易入门剖析(二)https://developer.aliyun.com/article/1432713


八、vue3的生命周期

8.1 vue2的生命周期


8.2 vue3生命周期

**注意:**vue2的生命周期写法在vue3中同样可以使用。

vue3生命周期图解:


你可以通过在生命周期钩子前面加上 “on” 来访问组件的生命周期钩子。

下表包含如何在 setup () 内部调用生命周期钩子:

选项式 API Hook inside setup
beforeCreate setup()
created setup()
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeUnmount onBeforeUnmount
unmounted onUnmounted
errorCaptured onErrorCaptured
renderTracked onRenderTracked
renderTriggered onRenderTriggered
activated onActivated
deactivated onDeactivated

**注意:**因为 setup 是围绕 beforeCreatecreated 生命周期钩子运行的,所以不需要显式地定义它们。换句话说,在这些钩子中编写的任何代码都应该直接在 setup 函数中编写。

vue3中生命周期钩子的使用方法(组合API形式):

这些函数接受一个回调函数,当钩子被组件调用时将会被执行:

<template>
  <h1>App.vue组件</h1>
  <h3>{{age}}</h3><button @click="age+=1">点我</button>
</template>
<script>
    //首先导入需要使用生命周期钩子函数
  import {ref,onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted} from 'vue'
  export default {
    name: 'App',
    components: {},
    setup(){
      let age = ref(18)
      console.log('================beforeCreate======================')
      console.log('================created======================')
      onBeforeMount(()=>{
        console.log('================onBeforeMount======================')
      })
      onMounted(()=>{
        console.log('================onMounted======================')
      })
      onBeforeUpdate(()=>{
        console.log('================onBeforeUpdate======================')
      })
      onUpdated(()=>{
        console.log('================onUpdated======================')
      })
            //当组件进行切换时 可以调用卸载钩子函数
      onBeforeUnmount(()=>{
        console.log('================onBeforeUnmount======================')
      })
      onUnmounted(()=>{
        console.log('================onUnmounted======================')
      })
      return {age}
    }
  }
</script>

九、响应式API的使用

9.1 响应性基础API

9.1.1 reactive 与 shallowReactive
  • reactive
    **概念:**返回对象的响应式副本
const obj = reactive({ count: 0 })
  • 响应式转换是“深层”的——它影响所有嵌套 property。在基于 ES2015 Proxy 的实现中,返回的 proxy 是等于原始对象的。建议只使用响应式 proxy,避免依赖原始对象。
  • shallowReactive
    **概念:**创建一个响应式代理,它跟踪其自身 property 的响应性,但不执行嵌套对象的深层响应式转换 (暴露原始值)。
    只处理对象最外层属性的响应式,内层嵌套的数据就不再是响应式数据了。
const state = shallowReactive({
  foo: 1,
  nested: {
    bar: 2
  }
})
// 改变 state 本身的性质是响应式的
state.foo++
// ...但是不转换嵌套对象
isReactive(state.nested) // false
state.nested.bar++ // 非响应式
9.1.2 readonly 与 shallowReadonly
  • readonly
    **概念:**接受一个对象 (响应式或纯对象) 或 ref 并返回原始对象的只读代理。只读代理是深层的:任何被访问的嵌套 property 也是只读的。
    让一个数据变为只读的,深只读,内部嵌套的数据也是只读的
const original = reactive({ count: 0 })
const copy = readonly(original)
watchEffect(() => {
  // 用于响应性追踪
  console.log(copy.count)
})
// 变更 original 会触发依赖于副本的侦听器
original.count++
// 变更副本将失败并导致警告
copy.count++ // 警告!
  • shallowReadonly
    **概念:**创建一个 proxy,使其自身的 property 为只读,但不执行嵌套对象的深度只读转换 (暴露原始值)。
const state = shallowReadonly({
  foo: 1,
  nested: {
    bar: 2
  }
})
// 改变 state 本身的 property 将失败
state.foo++
// ...但适用于嵌套对象
isReadonly(state.nested) // false
state.nested.bar++ // 适用
  • 让一个数据变为只读的,浅层只读,内部嵌套的数据不是只读的
<script>
  import {reactive,ref,toRef,toRefs,shallowReadonly,readonly} from 'vue'
  export default{
    name:"Father",
    components:{Son},
    setup(){
      let fname = ref('父亲')
      let person = reactive({
        name:'张三',
        age:18,
        job:{
          salary:20
        }
      })
            //把person对象重新使用shallowReadonly包括 重新赋值给person
      person = shallowReadonly(person)
      return {
        ...toRefs(person)
      }
    }
  }
</script>
9.1.3 isProxy 、isReactive 、isReadonly
  • isProxy
    **概念:**检查对象是否是由 reactivereadonly 创建的 proxy。
  • isReactive
    **概念:**检查对象是否是由 reactive 创建的响应式代理。
import { reactive, isReactive } from 'vue'
export default {
  setup() {
    const state = reactive({
      name: 'John'
    })
    console.log(isReactive(state)) // -> true
  }
}
  • isReadonly
    **概念:**检查对象是否是由 readonly 创建的只读代理
9.1.4 toRaw和markRaw
  • toRaw
    **概念:**返回 reactivereadonly 代理的原始对象。这是一个“逃生舱”,可用于临时读取数据而无需承担代理访问/跟踪的开销,也可用于写入数据而避免触发更改。建议保留对原始对象的持久引用。请谨慎使用。
    把一个响应式对象转变成普通对象。
const foo = {}
const reactiveFoo = reactive(foo)
console.log(toRaw(reactiveFoo) === foo) // true
  • markRaw
    **概念:**标记一个对象,使其永远不会转换为 proxy。返回对象本身。
const foo = markRaw({})
console.log(isReactive(reactive(foo))) // false
// 嵌套在其他响应式对象中时也可以使用
const bar = reactive({ foo })
console.log(isReactive(bar.foo)) // false

9.2 refs引用型API

9.2.1 ref 和 unref 和 isRef
  • ref
    **概念:**接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个 .value property,指向该内部值。
    示例:
const count = ref(0)
console.log(count.value) // 0
count.value++
console.log(count.value) // 1
  • 如果将对象分配为 ref 值,则它将被 reactive 函数处理为深层的响应式对象。
  • unref
    **概念:**如果参数是一个 ref,则返回内部值,否则返回参数本身。这是 val = isRef(val) ? val.value : val 的语法糖函数。
  • isRef
    **概念:**检查值是否为一个 ref 对象
9.2.2 toRef和toRefs
  • toRef
    **概念:**可以用来为源响应式对象上的某个 property 新创建一个 ref。然后,ref 可以被传递,它会保持对其源 property 的响应式连接。
const state = reactive({
  foo: 1,
  bar: 2
})
const fooRef = toRef(state, 'foo')
fooRef.value++
console.log(state.foo) // 2
state.foo++
console.log(fooRef.value) // 3
  • 我们可以把对象中的常用数据通过toRef引用出来,这样就不需要再把整个对象向外返回了,写法上会简单些。
export default{
    name:"Father",
    setup(){
      let fname = ref('父亲')
      let person = reactive({
        name:'张三',
        age:18
      })
      return {
        name:toRef(person,'name')
      }
    }
  }
  • toRef引用响应式对象中的单个数据
  • toRefs
    **简介:**将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref
    当从组合式函数返回响应式对象时,toRefs 非常有用,这样消费组件就可以在不丢失响应性的情况下对返回的对象进行解构/展开:
    toRefs 引用响应式对象中的多个数据,可以以解构赋值的形式解析响应式对象
export default{
    name:"Father",
    setup(){
      let fname = ref('父亲')
      let person = reactive({
        name:'张三',
        age:18
      })
      return {
        ...toRefs(person)
      }
    }
  }
可以直接把整个person对象中所有的数据都变成 toRef形式 使用的时候 直接使用person对象的属性名就可以了。

十、vue3中其余的新增特性

10.1 全局定义----自定义指令,组件,混入,全局挂载。。。。

app.mixin app.use app.directive

全局挂载
app.config.globalProperties.foo = 'bar'

10.2 其它特性

  • data必须定义为函数式
  • 移除keycodes.数字
  • 移除过滤器
    fooRef.value++
    console.log(state.foo) // 2
    state.foo++
    console.log(fooRef.value) // 3
我们可以把对象中的常用数据通过toRef引用出来,这样就不需要再把整个对象向外返回了,写法上会简单些。
```js
export default{
    name:"Father",
    setup(){
      let fname = ref('父亲')
      let person = reactive({
        name:'张三',
        age:18
      })
      return {
        name:toRef(person,'name')
      }
    }
  }
我们可以通过toRef把一个响应式对象中的单个数据向外暴漏  并且这个单个数据 不会丢失对person对象的响应性。
  • toRef引用响应式对象中的单个数据
  • toRefs
    **简介:**将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref
    当从组合式函数返回响应式对象时,toRefs 非常有用,这样消费组件就可以在不丢失响应性的情况下对返回的对象进行解构/展开:
    toRefs 引用响应式对象中的多个数据,可以以解构赋值的形式解析响应式对象
export default{
    name:"Father",
    setup(){
      let fname = ref('父亲')
      let person = reactive({
        name:'张三',
        age:18
      })
      return {
        ...toRefs(person)
      }
    }
  }
可以直接把整个person对象中所有的数据都变成 toRef形式 使用的时候 直接使用person对象的属性名就可以了。

十、vue3中其余的新增特性

10.1 全局定义----自定义指令,组件,混入,全局挂载。。。。

app.mixin app.use app.directive

全局挂载
app.config.globalProperties.foo = 'bar'

10.2 其它特性

  • data必须定义为函数式
  • 移除keycodes.数字
  • 移除过滤器
  • 。。。。。。更多新特性请自行探索。
目录
相关文章
|
28天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
128 64
|
28天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
108 60
|
2天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
16 3
|
1月前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
28天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
32 8
|
27天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
30 1
|
27天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
36 1
|
28天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
1月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。

热门文章

最新文章