飞道的博客

Vue--》Vue3自定义组件以及新组件的使用讲解

359人阅读  评论(0)

目录

customRef

Vue3提供的新组件

Fragment

Teleport

Suspense

Vue3中全局API的改变


customRef

创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显示控制。


  
  1. <template>
  2. <input type="text" v-model="keyword">
  3. <h3>{{keyword}} </h3>
  4. </template>
  5. <script>
  6. import { customRef } from 'vue';
  7. export default {
  8. setup( ){
  9. // 创建自定义ref
  10. function myref( value){
  11. let timer
  12. return customRef( (track,trigger)=>{
  13. return {
  14. get( ){
  15. console. log( `有人读取数据,我把数据${value}给他了`);
  16. track() // 通知Vue去追踪value的变化
  17. return value
  18. },
  19. set( newValue){
  20. console. log( `有人修改数据为:${newValue}`);
  21. clearTimeout(timer)
  22. timer = setTimeout( ()=>{
  23. value = newValue
  24. trigger() // 通知Vue重新去解析模板
  25. }, 500)
  26. }
  27. }
  28. })
  29. }
  30. let keyword = myref( 'hello')
  31. return {keyword}
  32. }
  33. }
  34. </script>

通过自定义ref,可以很方便的对其中的某些具体实现流程进行一定控制,实现一些特殊的效果。

还有一些组合式API就不再提及,需求者可自行去官网查看。

响应式数据的判断

isRef:检查一个值是否为一个 ref 对象

isReactive:检查一个对象是否是由 reactive 创建的响应式代理

isReadonly:检查一个对象是否是由 readonly 创建的只读代理

isProxy:检查一个对象是否是由 reactive 或者 readonly 方法方法创建的代理

组合式API的优势

传统的OptionsAPI,新增或修改一个需求,需要在data、methods、computed里去修改。

Composition API可以优雅的组织我们的代码,函数。让相关功能的代码有序组织在一起。

Vue3提供的新组件

在Vue3中不止语法进行了一定的修缮,而且出现了一些,Vue不存在的新的组件,举几个常年的组件进行讲解,如下:

Fragment

在Vue2中,组件必须有一个根组件,而在Vue3中组件可以没有根组件,内部会将多个标签包含在一个Fragment虚拟元素中。减少了标签层级,减少了内存使用。

Teleport

Teleport是一种能够将我们的组件html结构移动到指定位置的技术。比如一个嵌套很深的组件有个功能,需要进行CSS样式美化,如果嵌套太深,写css的层级太深不好操作,我们就可以借助这个组件将我们要修改的内容单独拎出来!

Suspense

等待异步组件时渲染一些额外的内容,让用户有更好的用户体验。其使用方式如下:


  
  1. <template>
  2. <div class="app">
  3. <h2>App根组件 </h2>
  4. <Suspense>
  5. <template v-slot:default>
  6. <levelTwoVue> </levelTwoVue>
  7. </template>
  8. <template v-slot:fallback>
  9. <h3>稍等,加载中.... </h3>
  10. </template>
  11. </Suspense>
  12. </div>
  13. </template>
  14. <script>
  15. // import levelTwoVue from './components/test/levelTwo.vue'; // 静态引入
  16. import { defineAsyncComponent, defineComponent } from 'vue';
  17. const levelTwoVue = defineAsyncComponent( ()=> import( './components/test/levelTwo.vue')) // 异步引入
  18. export default {
  19. components:{
  20. levelTwoVue
  21. },
  22. }
  23. </script>
  24. <style lang="less" scoped>
  25. .app{
  26. background-color: gray;
  27. padding: 20px;
  28. }
  29. </style>

子组件的样式也写上吧:


  
  1. <template>
  2. <div class="two">
  3. <h2>二级组件-子组件 </h2>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. }
  9. </script>
  10. <style lang="less" scoped>
  11. .two{
  12. background-color: red;
  13. padding: 20px;
  14. }
  15. </style>

当然除了网速的限制让我们出现额外的渲染,也可以通过setup返回Promise对象实例,并对其加以定时器来实现延迟渲染页面的效果。如下:


  
  1. <template>
  2. <div class="two">
  3. <h2>二级组件-子组件 </h2>
  4. {{num}}
  5. </div>
  6. </template>
  7. <script>
  8. import { ref } from 'vue';
  9. export default {
  10. setup( ){
  11. let num = ref( 0)
  12. return new Promise( (resolve)=>{
  13. setTimeout( ()=>{
  14. resolve({num})
  15. }, 1000)
  16. })
  17. }
  18. }
  19. </script>

Vue3中全局API的改变

Vue2.x有许多全局API和配置。例如注册全局组件和注册全局指令,在Vue3.0中对这些API做出了调整,是将全局的API,即:Vue.xxx 调整到应用实例 app 上。

2.x全局API(Vue) 3.x实例API(app)
Vue.config.xxxx  app.config.xxxx
Vue.config.productionTip Vue3移除了
Vue.component app.component
Vue.directive app.directive
Vue.mixin app.mixin
Vue.use app.use
Vue.prototype app.config.globalProperties

转载:https://blog.csdn.net/qq_53123067/article/details/128583625
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场