Vue 生命周期、axios 异步请求

梦里梦外; 2023-02-17 11:09 49阅读 0赞

目录

      • Vue对象的生命周期
      • axios 异步请求
      • axios传到后端的参数全部为null的问题
      • 说明

Vue对象的生命周期

在这里插入图片描述
红框中的是钩子函数,成对出现,一共4对8个。

组件也是一个Vue实例,也有这些生命周期,并不是要显式new Vue()才算Vue对象。

  1. Vue.component('Test',{
  2. template:` <div> <p>{ {msg}},我是test组件</p> <button @click='msg+=" chy"'>更新数据</button> </div> `,
  3. data(){
  4. return{
  5. msg:'hello'
  6. }
  7. },
  8. // 数据挂载: 执行data()函数,初始化变量。这个过程会触发数据挂载事件,会依次调用2个钩子函数
  9. // 组件创建前,数据尚未挂载
  10. beforeCreate(){
  11. console.log('组件创建前',this.msg); //this.msg是undefined
  12. },
  13. // 组件创建后,数据已挂载
  14. created(){
  15. console.log('组件创建后',this.msg); //this.msg的值是"hello"
  16. },
  17. // dom挂载:把模板作为innerHTML挂载到容器元素中。会触发dom挂载事件,依次调用2个钩子函数
  18. // dom挂载前
  19. beforeMount() {
  20. console.log('dom挂载前',document.getElementById("app").innerHTML); //此时组件的dom尚未挂载,innerHTML为空
  21. },
  22. // dom挂载后
  23. mounted() {
  24. console.log('dom挂载后',document.getElementById("app").innerHTML); //此时组件的dom已挂载,innerHTML有值
  25. },
  26. // 挂载完毕后,修改data中的变量时会触发数据更新事件,依次调用2个钩子函数
  27. // 数据更新前,数据指的是内存中的变量,
  28. beforeUpdate() {
  29. console.log('数据更新前',document.body.innerHTML);
  30. },
  31. // 数据更新后
  32. updated() {
  33. console.log('数据更新后',document.body.innerHTML); //如果打印的是this.msg,数据要已发生更新才能界定更新前后,此时数据已变了,更新前后打印出来的this.msg是一样的
  34. },
  35. // 触发组件销毁事件时,会依次调用2个钩子函数
  36. // 组件销毁前
  37. beforeDestroy() {
  38. console.log('组件销毁前');
  39. },
  40. // 组件销毁后
  41. destroyed() {
  42. console.log('组件销毁后');
  43. },
  44. });

性能调优

频繁创建组件会拉低性能,可以把组件放在中,不使用组件时会缓存组件(停用组件),不销毁;要使用组件时自动激活组件。

  1. <keep-alive>
  2. <test></test>
  3. </keep-alive>

使用后会增加1对(2个)生命周期方法

  1. // 组件已被激活
  2. activated() {
  3. console.log('组件激活')
  4. },
  5. // 组件已停用
  6. deactivated() {
  7. console.log('组件停用');
  8. },

axios 异步请求

  1. #下载axios
  2. npm install axios
  3. <!-- 引入vue.js -->
  4. <script src="js/vue.js"></script>
  5. <!-- 引入axios.js。上线时都换为min -->
  6. <script src="js/axios.js"></script>
  7. //自行设置请求方式、传递的参数
  8. axios({
  9. method:'post',
  10. url:'/login',
  11. data:{ //传给后台的数据
  12. username: 'chy',
  13. password: 'abcd'
  14. }
  15. }).then(resp => {
  16. console.log(resp.data); //resp是整个响应,.data部分才是后台返回的数据
  17. }).catch(err => {
  18. console.log(err);
  19. });
  20. //get的第二个参数是config, axios的请求配置,请求参数只是其中的一项,放在config的params属性中进行传递
  21. axios.get("/login", { params: { username: 'chy', password: 'abcd'}})
  22. .then(resp => {
  23. console.log(resp.data);
  24. });
  25. .catch(err => {
  26. console.log(err);
  27. });
  28. //post的第二个参数是data,用对象 {} 传递参数,不需要传递数据的可以缺省data
  29. axios.post('/login', { username: 'chy', password: 'abcd'})
  30. .then(resp => {
  31. console.log(resp.data);
  32. })
  33. .catch(err => {
  34. console.log(err);
  35. });

如果不需要后台返回数据,可以不要then,catch也不是必需的。

可以用resultType指定期待返回的数据类型,会自动识别返回的数据类型,可以指定但没必要。

  1. //使用后台返回的数据
  2. console.log(resp.data); //返回字符串,直接用即可
  3. console.log(resp.data.username); //返回对象、map,可以取出字段值
  4. console.log(resp.data[0]); //返回数组,可以取出指定位置的元素
  5. console.log(resp.data[0].username); //如果后台返回的是json数组、对象数组,可以取出某个对象的字段值

axios传到后端的参数全部为null的问题

先排查是否是请求方式的原因,比如后端controller用RequestMapping标注(支持多种请求方式),用 @RequestBody 接收参数(请求体),但前端使用get方式发起请求。

如果不是请求方式的原因,可参考以下2种解决方案

1、URLSearchParams或FormData

  1. let params = new URLSearchParams();
  2. //let params = new FormData()
  3. params.append('username', 'chy');
  4. params.append('password', 'abcd');
  5. this.$axios.post('/xxx', params)
  6. .then(resp => {
  7. console.log(resp);
  8. })
  9. .catch(err => {
  10. console.log(err);
  11. });

2、使用qs

  1. //在main.js中导入qs,并挂载到Vue原型上
  2. //如果报错qs没有定义,需要自行npm install安装qs
  3. import qs from 'qs'
  4. Vue.prototype.$qs=qs
  5. //this.$qs.stringify(整个参数对象) 序列化整个参数对象为字符串进行传输
  6. this.$axios.post('/xxx', this.$qs.stringify(this.params))
  7. .then(resp => {
  8. console.log(resp.data);
  9. })
  10. .catch(err => {
  11. console.log(err);
  12. });

说明

  1. //初始化时从后端加载数据一般是放在 created() 中
  2. created() {
  3. this.$axios.post('/tag/getAll', { })
  4. .then(resp => {
  5. //把响应数据赋给 this.tagList
  6. this.tagList = resp.data;
  7. })
  8. .catch(err => {
  9. console.log(err)
  10. });
  11. //操作this.tagList,ajax是异步的,此时往往还没返回数据,所以操作的还是之前的值
  12. for (let tag in this.tagList) {
  13. //...
  14. }
  15. },

使用 ajax 时要注意 ajx 的异步特点,要操作响应数据应该放在ajax的回调函数中,而不是放在 ajax 之外。

发表评论

表情:
评论列表 (有 0 条评论,49人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue生命周期

    vue生命周期的理解 vue生命周期是指vue实例对象从创建之初到销毁的过程。 vue的生命周期总共分为8个阶段:创建前/后,载入前/后,更新前/后,销毁前/后 vue生

    相关 vue 生命周期

    1/ beforeCreate() 在创建Vue对象之前 ; 用途动画加载 2/ created() 组件(Vue的实例化对象)创建好了,属性也绑定了,但是DOM还没生成;用