龙空技术网

Vue3从入门到精通 14

道藏心源鹤铧 481

前言:

目前姐妹们对“cssprop”大概比较重视,看官们都想要学习一些“cssprop”的相关内容。那么小编也在网摘上汇集了一些关于“cssprop””的相关资讯,希望各位老铁们能喜欢,兄弟们一起来了解一下吧!

目录:

1异步组件

1.1什么是异步组件?

1.2为什么要使用异步组件?

1.3如何使用异步组件?

2依赖注入

2.1什么是依赖注入?

2.2如何使用依赖注入?

2.2.1 Prop 逐级透传问题

2.2.2 Provide (提供)

2.2.3应用层 Provide

2.2.4 Inject (注入)

2.2.5总结

2.3示例

1 异步组件

在传统的 Vue.js 开发中,组件是在应用程序启动时就立即加载的。

这种方式虽然简单,但是会导致应用程序的初始加载时间变长,影响用户体验。

为了提高应用程序的性能和加载速度,Vue.js 提供了异步组件。

1.1 什么是异步组件?

在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件。

异步组件是一种延迟加载组件的方式,即只有在需要使用该组件时才会进行加载。

Vue 提供了 defineAsyncComponent 方法来实现此功能。

1.2 为什么要使用异步组件?

异步组件可以减少打包的结果

会将异步组件分开打包,会采用异步的方式加载组件,可以有效的解决一个组件过大的问题。

不使用异步组件,如果组件功能比较多打包出来的结果就会变大。

1.3 如何使用异步组件?

Vue 提供了 defineAsyncComponent 方法来实现此功能。

类似 Vite 和 Webpack 这样的构建工具也支持此语法 (并且会将它们作为打包时的代码分割点),因此我们也可以用它来导入 Vue 单文件组件:

// 第一种方式import { defineAsyncComponent } from 'vue'// 异步加载组件const AComponent = defineAsyncComponent(()=>{ return  import("./components/AComponent.vue")})// 第二种方式import { defineAsyncComponent } from 'vue'// 异步加载组件const AComponent = defineAsyncComponent(()=>     import("./components/AComponent.vue"))

示例:

<template>  <h1>{{ title }}</h1>  <keep-alive>    <component     :is="dyComponent">    </component>  </keep-alive>  <hr>  <button @click="changeHandle">    切换组件  </button></template><script>import { defineAsyncComponent } from 'vue'// 异步加载组件const AComponent = defineAsyncComponent(()=>{ return  import("./components/AComponent.vue")})// import AComponent from './components/AComponent.vue';import BComponent from './components/BComponent.vue';export default {  data() {    return {      title: "动态组件",      dyComponent: "BComponent"    }  },  components: {    AComponent,    BComponent  },  methods: {    changeHandle() {      this.dyComponent = this.dyComponent === "AComponent" ? "BComponent" : "AComponent"      console.log("切换组件:"+this.dyComponent);    }  }}</script>

改造前:

改造后:

2 依赖注入2.1 什么事依赖注入?

依赖注入是一种设计模式。

他的目的是将组件之间的依赖关系解耦,使得组件之间的通信更加灵活和可维护。

在 vue 中,依赖注入是通过 provide 和 inject 两个 API 实现的。

2.2 如何使用依赖注入?

引用官网信息:

2.2.1 Prop 逐级透传问题

通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦:

注意,虽然这里的 <Footer> 组件可能根本不关心这些 props,但为了使 <DeepChild> 能访问到它们,仍然需要定义并向下传递。如果组件链路非常长,可能会影响到更多这条路上的组件。

这一问题被称为“prop 逐级透传”,显然是我们希望尽量避免的情况。

示例:

<template>    <h3>{{ title }}</h3>    <p>{{ title }} : {{ msg }}</p>    <Child :msg="msg"></Child></template><script>import Child from './Child.vue';export default {    data() {        return {            title: "Parent"        }    },    components: {        Child    },    props:{        msg:{            type:String        }    }}</script>
<template>    <h5>{{ title }}</h5>    <p>{{ title }} : {{ msg }}</p></template><script>export default{    data(){        return {            title:"Child"        }    },    props:{        msg:{            type:String        }    }}</script>
<template>  <h1>{{ title }}</h1>  <Parent msg="依赖注入-root"></Parent></template><script>import Parent from './components/Parent.vue';export default {  data() {    return {      title:"依赖注入"    }  },  components:{    Parent  }}</script>

provide 和 inject 可以帮助我们解决这一问题。 [1] 一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖。

2.2.2 Provide (提供)

要为组件后代提供数据,需要使用到 provide 选项:

export default {  provide: {    title: 'hello!'  }}

对于 provide 对象上的每一个属性,后代组件会用其 key 为注入名查找期望注入的值,属性的值就是要提供的数据。

如果我们需要提供依赖当前组件实例的状态 (比如那些由 data() 定义的数据属性),那么可以以函数形式使用 provide:

export default {  data() {    return {      title: 'hello!'    }  },  provide() {    // 使用函数的形式,可以访问到 `this`    return {      title: this.message    }  }}

然而,请注意这不会使注入保持响应性。

2.2.3 应用层 Provide

除了在一个组件中提供依赖,我们还可以在整个应用层面提供依赖:

import { createApp } from 'vue'const app = createApp({})app.provide(/* 注入名 */ 'message', /* 值 */ 'hello!')

在应用级别提供的数据在该应用内的所有组件中都可以注入。

这在你编写插件时会特别有用,因为插件一般都不会使用组件形式来提供值。

2.2.4 Inject (注入)

要注入上层组件提供的数据,需使用 inject 选项来声明:

export default {  inject: ['title'],  created() {    console.log(this.message) // injected value  }}

注入会在组件自身的状态之前被解析,因此你可以在 data() 中访问到注入的属性:

export default {  inject: ['title'],  data() {    return {      // 基于注入值的初始数据      fullMessage: this.message    }  }}
2.2.5 总结

注意:provide 和 inject 只能由上到下的传递,不能反向传递

2.3 示例

<template>    <h5>{{ title }}</h5>    <p>{{ message }}</p>    <p>{{ parentMessage }}</p>    <p>{{ title }} : {{ msg }}</p></template><script>export default{    inject: ['message','parentMessage'],    data(){        return {            title:"Child"        }    },    props:{        msg:{            type:String        }    }}</script>
<template>    <h3>{{ title }}</h3>    <p>{{ title }} : {{ msg }}</p>    <Child :msg="msg"></Child></template><script>import Child from './Child.vue';export default {    provide(){        return {            parentMessage:"provide - Parent - "+this.title        }    },    data() {        return {            title: "Parent"        }    },    components: {        Child    },    props:{        msg:{            type:String        }    }}</script>
<template>  <h1>{{ title }}</h1>  <Parent msg="依赖注入-root"></Parent></template><script>import Parent from './components/Parent.vue';export default {  data() {    return {      title: "依赖注入"    }  },  provide: {    message: "provide: 依赖注入"  },  components: {    Parent  }}</script>

标签: #cssprop