网站链接: 我爱捣鼓
当前位置: 首页 > 前端开发 > Vue

vue updated函数为什么反复触发?

2023/3/5 21:15:59

vue钩子函数update的作用就是数据修改时执行,那么在调用后updated函数被反复触发是什么原因呢?<!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge&…

        vue钩子函数update的作用就是数据修改时执行,那么在调用后updated函数被反复触发是什么原因呢?

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <h2 v-color="oRed">{{msg}}</h2>
        <button @click="changeMsg()">修改msg</button>
        <br>
        <input type="text" v-focus>
    </div>
</body>
<script>
    let vm = new Vue({
        el: "#app",
        data: {
            msg: "你过来呀!",
            oRed: "red"
        },
        methods: {
            changeMsg() {
                this.msg = "求求你们别打了";
            }
        },
        //定义私有指令
        directives: {
            // 对象的属性就是指令名
            color: { //color 指令名
                bind: function(el, args) {
                    el.style.color = args.value;
                },
                //钩子函数inserted--自定义指令
                inserted: function(el) {
                    console.log("inserted");
                },
                //钩子函数update--数据修改时执行
                update: function(el) {
                    console.log("修改数据时执行了update钩子函数");
                },
                //钩子函数componentUpdated--数据修改完执行
                componentUpdated: function(el) {
                    console.log("数据修改完执行了componentUpdated钩子函数");
                },
                //钩子函数unbind--只调用一次,指令与元素解绑时调用
                unbind: function() {
                    console.log("元素与指令解绑后调用unbind钩子函数");
                }
                //销毁见下方↓
            },
            // v-focus 自动获取表单焦点
            focus: {
                //bind无法自动选中的原因:
                inserted: function(el) {
                    el.focus();
                }
            }
        }
    });
    // 销毁
    vm.$destroy();
</script>
</html>

        官方文档:beforeUpdate()是针对视图层的,只有页面中渲染的数据发生改变或者渲染,才会触发这个生命周期函数,updated()中修改数据是会触发beforeUpdate()的

  • 原因:如果是请求方法里面

        1.操作了data()里面的值

        2.给data()里面的值赋了新值

        因为页面已经挂载完成了,如果操作data()的值,页面又会重新走更新周期里的方法,就会不停的发送请求,把操作data()的代码注释掉就不会一直发送请求了。

data(){
  return{
    loading:false
  }
},
beforeUpdate(){
   this.getQueryList()
},
methods:{
  async getQueryList(){
    this.loading = true  //这个是操作data()里的loading
    let _this = this,
    api = _this.$api.demo,
    params = {
    }
    const res = await _this.$post(api,params)
    //省略以下
  }
}

改为

data(){
  return{
    loading:false
  }
},
beforeUpdate(){
  this.getQueryList()
},
methods:{
 //去掉data()里面的值就不会一直发请求了
  async getQueryList(){
    let _this = this,
    api = _this.$api.demo,
    params = {
    }
    const res = await _this.$post(api,params)
    //省略以下
  }
}

        总结:尽量把请求放到mounted()里面请求,如果非要在beforeUpdate()和updated()请求,就不要再里面操作data()值.

        通过以上内容我们知道了vue updated函数为什么反复触发?。感谢您访问“我爱捣鼓(www.woaidaogu.com)”网站的内容,希望对大家有所帮助!引用本文内容时,请注明出处!谢谢合作!

相关资讯

  • vue兄弟平级组件如何传递参数值?

    vue组件传值不外乎三种,父传子、子传父、平级,今天我们就来着重说说vue平级组件如何传递参数值? 假设你有两个Vue组件需要通信: A 和 B ,A组件按钮上面绑定了点击事件,发送一则消息,B组件接收。初始化,全局创建$bus 直接在项目中的 main.js 初始化 …

    2023/1/7 13:08:32