生命周期_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初始化之后

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

<template>
  <div>
    <p>学习生命周期 - 看控制台打印</p>
    <p>{{ msg }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg: "hello vue",
    };
  },

  // 一、初始化
  // new Vue()之后,vue内部给实例对象添加了一些属性和方法,data和methods初始化之前
  beforeCreate() {
    console.log("beforeCreate --- 执行");
    console.log(this.msg); //undefined
  },

//data和methods初始化之后
//使用场景:网络请求,注册全局事件:页面滚动
  created() {
    console.log("create --- 执行");
    console.log(this.msg); //hello vue
  },

  methods: {},
};
</script>

<style lang="scss" scoped></style>

2.钩子函数-挂载阶段


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

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

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

 场景:挂载后真是DOM

  beforeMount() {
    console.log("beforeMounte --- 执行");
    // console.log(document.getElementById("myP")); //null
  },

 
  mounted() {
    console.log("mounted --- 执行");
    // console.log(document.getElementById("myP")); //<p data-v-07b77a01 id="myP">hello vue</p>
  },

 3.钩子函数-更新阶段

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

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

<template>
  <div>
    <ul id="myUL">
      <li v-for="(val, index) in arr" :key="index">{{ val }}</li>
    </ul>
    <button @click="arr.push(100)">数组添加末尾值</button>
  </div>
</template>



<script>
export default {
  data() {
    return {
      arr: [1, 2, 3, 4],
    
    };
  },

 
  beforeUpdate() {
    console.log("beforeUpate -- 执行"); //第一次点击button按钮,此语句执行,但是获取不到第四个li
    console.log(document.querySelectorAll("#myUL>li")[4]); //undefined
  },
 
  updated() {
    console.log("updated -- 执行"); //第一次点击button按钮,此语句执行,获取第四个li
    console.log(document.querySelectorAll("#myUL>li")[4]); //<li data-v-07b77a01="">100</li>
  },

 
};
</script>

4.钩子函数-销毁阶段

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

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

<template>
  <div>

    <life v-if="show"></life>
    <button @click="show = false">销毁</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
     
      timer: "",
    };
  },

  beforeDestroy() {
    console.log(" beforeDestroy -- 执行");
    clearInterval(this.timer)//销毁life后将不再执行定时器
  },
  destroyed() {
    console.log(" destroyed -- 执行");
  },
};
</script>

5.常用的钩子函数

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

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

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

二、axios

1.请求数据

使用async-awiat

<template>
  <div>
    <div>
      <h1>获取图书数据</h1>
      <button @click.prevent="getBooks">点击获取</button>
    </div>
  </div>
</template>

<script>
import axios from "axios";
export default {
  data() {
    return {};
  },
  methods: {
  async getBooks() {
      // axios({
      //   url: "http://liulongbin.top:3006/api/getbooks",
      //   // methods:"get"
      // }).then(res=>{
      //   console.log(res);
      // });

      const res = await axios({
        url: "http://liulongbin.top:3006/api/getbooks",
      })
      console.log(res);
    },
  },
};
</script>

<style lang="scss" scoped></style>

2.查询数据

<template>
  <div>
    <div>
      <h1>2-查询某本书的信息</h1>
      <input type="text" placeholder="请输入书名" v-model="bName" />
      <button @click="findFn">查询</button>
    </div>
  </div>
</template>
export default {
  methods: {
    async findFn() {
      const res = await axios({
        url: "/api/getbooks",

        params: {
          bookname: this.bName,
        },
      });
      console.log(res);
    },
};
</script>

3.配置全局基地址

import axios from "axios";

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

import axios from "axios";
axios.defaults.baseURL = "http://liulongbin.top:3006";
export default {
 
  methods: {
    
    async getBooks() {
      // axios({
      //   url: "http://liulongbin.top:3006/api/getbooks",
      //   // methods:"get"
      // }).then(res=>{
      //   console.log(res);
      // });

      const res = await axios({
        url: "/api/getbooks",
      });
      console.log(res);
    },
  },
};
</script>

三、组件进阶

1.$refs

子组件

<template>
  <div>
    <h1 ref="myH">这是一个P标签</h1>
    
  </div>
</template>

<script>
export default {
  data() {
    return {
      num:1
    };
  },
  methods: {
    fn(){
      console.log("子组件的方法被调用");
    }
  },
};
</script>

父组件

<template>
  <div>
    
    <child ref="myChild"></child>
  </div>
</template>

<script>
import child from "./components/child.vue";
export default {
  components: {
    child,
  },
  mounted() {
    this.$refs.myChild.fn();
    console.log(this.$refs.myChild.num);
  },
};
</script>

控制台打印

 2.$refs

<template>
  <div>
    <div>
      <h1>6-vue更新DOM是异步的</h1>
      <p ref="c">{{ count }}</p>
      <button @click="add">点击count++</button>
    </div>
  </div>
</template>
<script>


export default {
 
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    add() {
      this.count++; //vue检测数据更新是异步的,开启一个DOM更新队列(异步任务)
       console.log(this.$refs.c.innerHTML);//第一次点击为0

    
    },
   
  },
};
</script>

 原因:vue更新DOM是异步的

 解决:await this.$nextTick();

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

方法一

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

方法二

methods: {
    async clickFn() {
      this.count++;
      
      await this.$nextTick();
      console.log(this.$refs.myP.innerHTML);
    },
  },

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

<template>
  <div>
    <input type="text" placeholder="输入框" v-if="show" ref="myInp" />
    <button v-else @click="btn">点击搜索</button>
  </div>
</template>

<script>
// 需求:点击按钮输入框显示并聚焦,按钮隐藏
export default {
  data() {
    return {
      show: false,
    };
  },
  methods: {
  async  btn() {
      this.show = true;
      // this.$refs.myInp.focus()  报错
      // 原因:data变化更新DOM是异步的
      // 输入框还没有挂载到真实DOM上
      // 解决:
      // 方法一
      // this.$nextTick(() => {
      //   this.$refs.myInp.focus();
      // });

      // 方法二
      await this.$nextTick();
      this.$refs.myInp.focus();
    },
  },
};
</script>

<style lang="scss" scoped></style>

<think>好的,我现在需要回答用户关于在Vue.js的mounted生命周期钩子中使用axios进行HTTP请求的问题。首先,我得回忆一下Vue.js生命周期钩子,特别是mounted阶段的作用。mounted是在组件被挂载到DOM后调用的,这时候可以安全地操作DOM或者发起依赖于DOM的请求。 接下来,我需要整合axios的使用方法。根据引用内容,axios支持Promise,可以在get请求后使用.then和.catch处理响应和错误。例如,引用[2]中的例子展示了在mounted中使用axios.get获取数据,并将结果赋值给组件的info属性。同时,错误处理也是必要的,用.catch捕获异常。 然后,我需要考虑如何在mounted中正确编写异步请求。引用[3]和引用[4]提到,created钩子也适合发送请求,但mounted更适合需要DOM的情况。用户的问题明确提到mounted,所以重点应放在这里。可能需要对比created和mounted的使用场景,但用户的问题不涉及,所以可以简要提及。 步骤方面,首先引入axios,然后在mounted中调用axios.get或post,处理响应和错误。要注意将响应数据赋值给Vue实例的data属性,这样才能触发视图更新。引用[2]的例子中,this.info = response,但实际可能需要response.data,如引用[3]中的代码所示。 另外,是否需要全局配置axios的baseURL?引用[1]提到可以设置axios.defaults.baseURL,这样在多个请求中可以简化代码。这可能是一个优化点,但用户的问题主要是集成和使用,所以可以作为可选步骤。 最后,确保代码示例正确,使用ES6的箭头函数或async/await。引用[4]展示了async/await的用法,可能更现代。但用户可能也需要传统.then的写法,所以两种方式都可以展示。 总结回答结构:先介绍mounted钩子的作用,然后分步骤说明如何集成axios,包括安装、基本请求、处理响应和错误,最后提供完整示例。同时,注意引用相关的内容,如引用[2]和引用[3]的例子。</think>在Vue.js中,`mounted`生命周期钩子是集成axios进行HTTP请求的关键阶段,以下是具体实现方法: ### 一、mounted钩子的特性 `mounted`在组件DOM挂载完成后触发,适用于需要访问DOM元素或初始化依赖DOM的异步请求的场景[^3]。与`created`钩子相比,`mounted`更适用于需要确保DOM存在的操作。 ### 二、axios集成步骤 1. **安装axios** ```bash npm install axios ``` 2. **基础GET请求实现** ```javascript mounted() { axios.get('https://api.example.com/data') .then(response => { this.dataList = response.data // 数据绑定到组件状态 }) .catch(error => { console.error('请求失败:', error) // 错误处理 }) } ``` 此示例演示了获取数据后更新组件状态的典型模式[^2][^3] 3. **POST请求示例** ```javascript mounted() { axios.post('/api/submit', { name: '用户' }) .then(res => console.log(res.data)) .catch(err => console.error(err)) } ``` 4. **async/await优化** ```javascript async mounted() { try { const response = await axios.get('/api/config') this.config = response.data } catch (e) { console.error('配置加载失败', e) } } ``` 使用异步函数可提升代码可读性[^4] ### 三、最佳实践 1. **全局配置(可选)** ```javascript // main.js axios.defaults.baseURL = 'https://api.yourservice.com' axios.defaults.timeout = 5000 ``` 2. **请求拦截器** ```javascript axios.interceptors.request.use(config => { config.headers.Authorization = localStorage.getItem('token') return config }) ``` 3. **响应处理规范** ```javascript .then(response => { if (response.status === 200 && response.data.code === 0) { this.validData = response.data.result } else { throw new Error('业务逻辑异常') } }) ``` ### 四、完整组件示例 ```vue <template> <div> <ul> <li v-for="item in items" :key="item.id">{{ item.name }}</li> </ul> </div> </template> <script> import axios from 'axios' export default { data() { return { items: [] } }, async mounted() { try { const { data } = await axios.get('/api/items') this.items = data.items } catch (error) { console.error('数据加载失败:', error) this.items = [] // 重置为空数组 } } } </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值