当前位置:   article > 正文

生命周期_axios_axios生命周期

axios生命周期

目录​​​​​​​

一、钩子函数

 1.钩子函数-初始化阶段

2.钩子函数-挂载阶段

 3.钩子函数-更新阶段

4.钩子函数-销毁阶段

5.常用的钩子函数

二、axios

1.请求数据

2.查询数据

3.配置全局基地址

三、组件进阶

1.$refs

 2.$refs

3. refs案例---输入框聚焦


一、钩子函数

Vue 框架内置函数,随着组件的生命周期阶段,自动执行

⚫ 作用: 特定的时间点,执行特定的操作

⚫ 场景: 组件创建完毕后,可以在created 生命周期函数中发起Ajax 请求,从而初始化 data 数

⚫ 分类: 4大阶段8个方法

 1.钩子函数-初始化阶段

⚫beforeCreate():new Vue()之后,vue内部给实例对象添加了一些属性和方法,data和methods初始化之前

⚫create():data和methods初始化之后

使用场景:网络请求,注册全局事件:页面滚动

  1. <template>
  2. <div>
  3. <p>学习生命周期 - 看控制台打印</p>
  4. <p>{{ msg }}</p>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. msg: "hello vue",
  12. };
  13. },
  14. // 一、初始化
  15. // new Vue()之后,vue内部给实例对象添加了一些属性和方法,data和methods初始化之前
  16. beforeCreate() {
  17. console.log("beforeCreate --- 执行");
  18. console.log(this.msg); //undefined
  19. },
  20. //data和methods初始化之后
  21. //使用场景:网络请求,注册全局事件:页面滚动
  22. created() {
  23. console.log("create --- 执行");
  24. console.log(this.msg); //hello vue
  25. },
  26. methods: {},
  27. };
  28. </script>
  29. <style lang="scss" scoped></style>

2.钩子函数-挂载阶段


⚫beforeMount()挂载  真实DOM挂载之前,拿不到真实DOM

场景:预处理data,不会触发updated钩子函数

⚫mounted() 真实DOM挂载之后,拿到真实DOM

 场景:挂载后真是DOM

  1. beforeMount() {
  2. console.log("beforeMounte --- 执行");
  3. // console.log(document.getElementById("myP")); //null
  4. },
  5. mounted() {
  6. console.log("mounted --- 执行");
  7. // console.log(document.getElementById("myP")); //<p data-v-07b77a01 id="myP">hello vue</p>
  8. },

 3.钩子函数-更新阶段

  ⚫beforeUpdate()当data里数据改变, 更新DOM之前

  ⚫updated()当数据发生变化并更新页面后,获取最新的真实DOM

  1. <template>
  2. <div>
  3. <ul id="myUL">
  4. <li v-for="(val, index) in arr" :key="index">{{ val }}</li>
  5. </ul>
  6. <button @click="arr.push(100)">数组添加末尾值</button>
  7. </div>
  8. </template>
  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. arr: [1, 2, 3, 4],
  6. };
  7. },
  8. beforeUpdate() {
  9. console.log("beforeUpate -- 执行"); //第一次点击button按钮,此语句执行,但是获取不到第四个li
  10. console.log(document.querySelectorAll("#myUL>li")[4]); //undefined
  11. },
  12. updated() {
  13. console.log("updated -- 执行"); //第一次点击button按钮,此语句执行,获取第四个li
  14. console.log(document.querySelectorAll("#myUL>li")[4]); //<li data-v-07b77a01="">100</li>
  15. },
  16. };
  17. </script>

4.钩子函数-销毁阶段

⚫前提:v-if="false" 销毁Vue实例

⚫场景:移除全局事件,移除当前组件的计时器、定时器(因为即使当前组件被销毁,定时器仍然会一直执行)、eventBus移除事件$off方法

  1. <template>
  2. <div>
  3. <life v-if="show"></life>
  4. <button @click="show = false">销毁</button>
  5. </div>
  6. </template>
  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. timer: "",
  6. };
  7. },
  8. beforeDestroy() {
  9. console.log(" beforeDestroy -- 执行");
  10. clearInterval(this.timer)//销毁life后将不再执行定时器
  11. },
  12. destroyed() {
  13. console.log(" destroyed -- 执行");
  14. },
  15. };
  16. </script>

5.常用的钩子函数

⚫created可以在此阶段获取data中的数据以及发送接口请求

⚫mounted在此阶段获取DOM元素,echars图标

⚫beforeDestroy在此阶段移除页面定时器和事件监听

二、axios

1.请求数据

使用async-awiat

  1. <template>
  2. <div>
  3. <div>
  4. <h1>获取图书数据</h1>
  5. <button @click.prevent="getBooks">点击获取</button>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. import axios from "axios";
  11. export default {
  12. data() {
  13. return {};
  14. },
  15. methods: {
  16. async getBooks() {
  17. // axios({
  18. // url: "http://liulongbin.top:3006/api/getbooks",
  19. // // methods:"get"
  20. // }).then(res=>{
  21. // console.log(res);
  22. // });
  23. const res = await axios({
  24. url: "http://liulongbin.top:3006/api/getbooks",
  25. })
  26. console.log(res);
  27. },
  28. },
  29. };
  30. </script>
  31. <style lang="scss" scoped></style>

2.查询数据

  1. <template>
  2. <div>
  3. <div>
  4. <h1>2-查询某本书的信息</h1>
  5. <input type="text" placeholder="请输入书名" v-model="bName" />
  6. <button @click="findFn">查询</button>
  7. </div>
  8. </div>
  9. </template>
  1. export default {
  2. methods: {
  3. async findFn() {
  4. const res = await axios({
  5. url: "/api/getbooks",
  6. params: {
  7. bookname: this.bName,
  8. },
  9. });
  10. console.log(res);
  11. },
  12. };
  13. </script>

3.配置全局基地址

import axios from "axios";

axios.defaults.baseURL = "基地址";

  1. import axios from "axios";
  2. axios.defaults.baseURL = "http://liulongbin.top:3006";
  3. export default {
  4. methods: {
  5. async getBooks() {
  6. // axios({
  7. // url: "http://liulongbin.top:3006/api/getbooks",
  8. // // methods:"get"
  9. // }).then(res=>{
  10. // console.log(res);
  11. // });
  12. const res = await axios({
  13. url: "/api/getbooks",
  14. });
  15. console.log(res);
  16. },
  17. },
  18. };
  19. </script>

三、组件进阶

1.$refs

子组件

  1. <template>
  2. <div>
  3. <h1 ref="myH">这是一个P标签</h1>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. num:1
  11. };
  12. },
  13. methods: {
  14. fn(){
  15. console.log("子组件的方法被调用");
  16. }
  17. },
  18. };
  19. </script>

父组件

  1. <template>
  2. <div>
  3. <child ref="myChild"></child>
  4. </div>
  5. </template>
  6. <script>
  7. import child from "./components/child.vue";
  8. export default {
  9. components: {
  10. child,
  11. },
  12. mounted() {
  13. this.$refs.myChild.fn();
  14. console.log(this.$refs.myChild.num);
  15. },
  16. };
  17. </script>

控制台打印

 2.$refs

  1. <template>
  2. <div>
  3. <div>
  4. <h1>6-vue更新DOM是异步的</h1>
  5. <p ref="c">{{ count }}</p>
  6. <button @click="add">点击count++</button>
  7. </div>
  8. </div>
  9. </template>
  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. count: 0,
  6. };
  7. },
  8. methods: {
  9. add() {
  10. this.count++; //vue检测数据更新是异步的,开启一个DOM更新队列(异步任务)
  11. console.log(this.$refs.c.innerHTML);//第一次点击为0
  12. },
  13. },
  14. };
  15. </script>

 原因:vue更新DOM是异步的

 解决:await this.$nextTick();

过程:DOM更新完会依次触发$nextTick里的函数体

方法一

this.$nextTick(() => console.log(this.$refs.c.innerHTML)); //第一次点击为1

方法二

  1. methods: {
  2. async clickFn() {
  3. this.count++;
  4. await this.$nextTick();
  5. console.log(this.$refs.myP.innerHTML);
  6. },
  7. },

3. refs案例---输入框聚焦

  1. <template>
  2. <div>
  3. <input type="text" placeholder="输入框" v-if="show" ref="myInp" />
  4. <button v-else @click="btn">点击搜索</button>
  5. </div>
  6. </template>
  7. <script>
  8. // 需求:点击按钮输入框显示并聚焦,按钮隐藏
  9. export default {
  10. data() {
  11. return {
  12. show: false,
  13. };
  14. },
  15. methods: {
  16. async btn() {
  17. this.show = true;
  18. // this.$refs.myInp.focus() 报错
  19. // 原因:data变化更新DOM是异步的
  20. // 输入框还没有挂载到真实DOM上
  21. // 解决:
  22. // 方法一
  23. // this.$nextTick(() => {
  24. // this.$refs.myInp.focus();
  25. // });
  26. // 方法二
  27. await this.$nextTick();
  28. this.$refs.myInp.focus();
  29. },
  30. },
  31. };
  32. </script>
  33. <style lang="scss" scoped></style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/529645
推荐阅读
相关标签
  

闽ICP备14008679号