vue3基础(五)

45 阅读3分钟

组件的生命周期

1.创建期 beforeCreate created

2.挂载期 beforeMounte mounted

3.更新期 beforeUpdate updated

4.销毁期 beforeUnmount unmounted

image.png

<template>
  <p>组件的生命周期</p>
  <div>{{ message }}</div>
  <button @click="updatedata">更新数据</button>
</template>
<!--1.创建期 beforeCreate  created

2.挂载期 beforeMounte mounted

3.更新期 beforeUpdate updated

4.销毁期 beforeUnmount unmounted
    -->
<script>
export default {
  name: "mounted_life",
  data() {
    return {
      message: "数据更新之前"
    }
  },
  methods: {
    updatedata() {
      this.message = '更新之后'
    }
  },
  beforeCreate() {
    console.log("组件创建之前")
  },
  created() {
    console.log("组件创建之后")
  },
  beforeMount() {
    console.log("组件渲染之前")
  },
  mounted() {
    console.log("组件渲染之后")
  },
  beforeUpdate() {
    console.log("组件更新之前")
  },
  updated() {
    console.log("组件更新之后")
  },
  beforeUnmount() {
    console.log("组件销毁之前")
  },
  unmounted() {
    console.log("组件销毁之后")

  }

}
</script>

<style scoped>

</style>

我们可以在代码上清楚地知道他的组件执行流程

二.动态组件

<template>
  <component :is="tabcomponent"></component>
  <button @click="change_component">点击切换组件</button>
</template>

<script>
import ComponentA from "@/components/ComponentA.vue";
import ComponentB from "@/components/ComponentB.vue";
export default {
  name: "change_component",
  data() {
    return {
      tabcomponent: "ComponentA"
    }
  },
  components: {
    ComponentA,
    ComponentB
  },
  methods: {
    change_component() {
      this.tabcomponent = this.tabcomponent == "ComponentA" ? "ComponentB" : "ComponentA";
    }
  }
}
</script>

<style scoped>

</style>

我们导入两个组件,然后通过按钮事件和component标签这样让组件进行切换

三.组件保持存活

我们在切换组件的时候会导致组件被卸载删除,那么我们重新加载回来的时候,就会很浪费资源,所以我们希望能够让在切换的时候还存活,你可以理解为手机后台,打游戏不用重新加载,我们在vue中可以使用keep-alive标签

<template>
    <keep-alive>
  <component :is="tabcomponent"></component>
    </keep-alive>
  <button @click="change_component">点击切换组件</button>
</template>

<script>
import ComponentA from "@/components/ComponentA.vue";
import ComponentB from "@/components/ComponentB.vue";
export default {
  name: "change_component",
  data() {
    return {
      tabcomponent: "ComponentA"
    }
  },
  components: {
    ComponentA,
    ComponentB
  },
  methods: {
    change_component() {
      this.tabcomponent = this.tabcomponent == "ComponentA" ? "ComponentB" : "ComponentA";
    }
  }
}
</script>

<style scoped>

</style>

四.异步组件加载

什么是异步组件加载,就是我在运行项目或者需要用到组件的时候,是用到组件的时候才会加载组件,而不是启动项目的时候就全部组件一起加载,这样在组件数量多的时候会大大增加我们的性能

<template>
    <keep-alive>
  <component :is="tabcomponent"></component>
    </keep-alive>
  <button @click="change_component">点击切换组件</button>
</template>

<script>
import ComponentA from "@/components/ComponentA.vue";
import {defineAsyncComponent} from "vue";
// 异步加载组件
const ComponentB=defineAsyncComponent(()=>
  import("@/components/ComponentB.vue"))
export default {
  name: "change_component",
  data() {
    return {
      tabcomponent: "ComponentA"
    }
  },
  components: {
    ComponentA,
    ComponentB
  },
  methods: {
    change_component() {
      this.tabcomponent = this.tabcomponent == "ComponentA" ? "ComponentB" : "ComponentA";
    }
  }
}
</script>

<style scoped>

</style>

我们在代码中用关键词defineAsyncComponent来实现,用法就是这样

const ComponentB=defineAsyncComponent(()=> import("@/components/ComponentB.vue"))

这样可以让我们的效率更高

五.依赖注入

image.png

Vue 3 引入了基于函数式的依赖注入系统,以提供更灵活的组件通信方式。在 Vue 3 中,你可以使用 provideinject 来实现依赖注入。

  • provide:用于在父组件中提供数据,可以是一个值或一个函数,允许子组件通过 inject 访问这些数据。
  • inject:用于在子组件中接收父组件通过 provide 提供的数据
<template>
  <div>
    <p>Parent Component</p>
    <ChildComponent />
  </div>
</template>

<script>
import { ref, provide } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,
  },
  setup() {
    const message = ref('Hello from parent!');

    // 使用 provide 提供数据给子组件
    provide('message', message);

    return {
      message,
    };
  },
};
</script>

<template>
  <div>
    <p>Child Component</p>
    <p>{{ injectedMessage }}</p>
  </div>
</template>

<script>
import { inject } from 'vue';

export default {
  setup() {
    // 使用 inject 获取父组件提供的数据
    const injectedMessage = inject('message', '默认值');

    return {
      injectedMessage,
    };
  },
};
</script>

在这个例子中,ParentComponent 使用 provide 提供了一个名为 message 的数据给其子组件 ChildComponent,而 ChildComponent 则使用 inject 获取了这个数据。这样,父子组件之间实现了简单的依赖注入