Vue前端框架12 组件生命周期、生命周期的应用、动态组件、组件保持存活、异步组件、依赖注入、Vue应用原理

文章目录

一、组件生命周期

每个Vue组件在创建时需要经历一系列的初始化步骤,比如设置侦听,编译模板,挂载实例到DOM,或者数据改变时更新DOM。

在这个过程中,也会运行生命周期钩子函数,可以让我们在特定阶段运行自己的代码。

javascript 复制代码
<template>
  <h3>组件的生命周期</h3>
  <p>{{message}}</p>
  <button @click="updateMessage">更新数据</button>

</template>

<script>
/**
 * 生命周期函数分为四个时期
 * 创建期:beforeCreate、created
 * 挂载期:beforeMount、mounted
 * 更新期:beforeUpdate、updated
 * 销毁期:beforeUnmount、unmounted
 */
export default {
  name: 'App',
  data(){
    return{
      message:"更新之前"
    }
  },
  methods:{
    updateMessage(){
      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>

二、生命周期的应用

主要俩个应用:

1、通过ref获取元素DOM结构

2、模拟网络请求渲染数据

javascript 复制代码
<template>
  <h3 ref="title">组件的生命周期</h3>
</template>

<script>
export default {
  name: 'App',
  data(){
    return{
      message:"更新之前"
    }
  },
  beforeMount(){
    console.log("组件挂载之前")
    console.log(this.$refs.title)
  },
  mounted(){
    console.log("组件挂载")
    console.log(this.$refs.title)
  }
}
</script>

三、动态组件

javascript 复制代码
<template>
  <Component :is="tabComponent"></Component>
  <button @click="changeHandle">切换组件</button>
</template>

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

<style scoped>

</style>

四、组件保持存活

在使用上面说的component:is 在多个组件之间切换时,被切换的组件会被卸载

可以通过keep-alive 组件强制被切换掉的组件依然保持存活状态

javascript 复制代码
<template>
  <keep-alive>
    <Component :is="tabComponent"></Component>
  </keep-alive>
  <button @click="changeHandle">切换组件</button>
</template>

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

<style scoped>

</style>
javascript 复制代码
<template>
  <h3>ComponentA</h3>
  <p>{{message}}</p>
  <button @click="changeHandle">切换数据</button>
</template>
<script>
  export default {
    data(){
      return{
        message:"老数据"
      }
    },
    methods:{
      changeHandle(){
        this.message="新数据"
      }
    }
  }
</script>

五、异步组件

Vue通过defineAsyncComponent方法来实现此功能

javascript 复制代码
<template>
  <keep-alive>
    <Component :is="tabComponent"></Component>
  </keep-alive>
  <button @click="changeHandle">切换组件</button>
</template>

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

<style scoped>

</style>

六、依赖注入

prop只可以进行逐层透传

provide和inject可以帮助我们解决逐层透传带来的复杂操作

javascript 复制代码
<template>
  <Cpeople2></Cpeople2>
</template>

<script>
//注意 provide和inject只可以上传下 不可以反向
import Cpeople2 from "@/components/Cpeople2";
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Cpeople1",
  data(){
    return{
      message:"爷爷的财产"
    }
  },
  // provide:{
  //   message:"爷爷的财产"
  // },
  provide(){
    return{
      message:this.message
    }
  },
  components: {Cpeople2}
}
</script>

<style scoped>

</style>
javascript 复制代码
<template>
  <P>{{message}}</P>
  <P>{{fullMessage}}</P>
</template>

<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Cpeople3",
//  通过 inject 获得 祖宗的provide
  inject:["message"],
  data(){
    return{
      fullMessage:this.message
    }
  }
}
</script>

<style scoped>

</style>

也可以从根开始传

javascript 复制代码
import { createApp } from 'vue'
import App from './App.vue'

const app=createApp(App)
//注入全局数据
app.provide("gData","全局数据")

app.mount('#app')

七、Vue应用

每个Vue应用都是从createApp函数创建的一个新的应用实例

javascript 复制代码
import { createApp } from 'vue'
import App from './App.vue'

const app=createApp({
//根组件选项
})
//注入全局数据
app.provide("gData","全局数据")

app.mount('#app')

一般我们都用App.vue作为我们的根组件

只有调用了mount()方法后才可以渲染出来

公共资源存放在src目录下的assets文件夹下

主要的入口就是index,html文件

相关推荐
To_OC5 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic6 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy6 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志6 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble7 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯8 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜9 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司9 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
kaiking_g9 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js
江华森10 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http