【vue.js】生命周期 和 bus.$on事件被多次绑定

 记录一下周期问题,是因为$on()多次触发导致的,所以先解决一下$on()多次绑定问题

 

vue中bus.$on事件被多次绑定

问题描述:只要页面没有强制刷新,存在组件切换,bus.$on方法会被多次绑定,造成事件多次触发

解决办法一:在每次调用方法前先解绑事件( bus.$off ),然后在重新绑定( bus.$on )

bus.$off('pagechangep'); //先解绑,不然会多次出发
bus.$on('pagechangep',function(i){
      that.publishpageTo(i);
});

解决办法二:注册的总线事件(Bus)要在组件销毁时(beforeDestroy/destroyed)卸载,否则会多次挂载,造成触发一次但多个响应的情况

beforeDestroy () {
  bus.$off("backUpLevel");
}

----------------------------------------------------分割线 ----------------------------------------------------

【vue.js】生命周期——beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDesotry、destoryed

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app" ref="app">
        {{ name }}
    </div>
</body>
    <script>
        let vm=new Vue({
            el:"#app",
            data:{
                name:"liuting",
            },
            beforeCreate(){
                console.log("创建前:");
                console.log(this.$el);
                console.log(this.$data);
            },
            created(){
                console.log("创建完成:");
                console.log(this.$el);
                console.log(this.$data);
            },
            beforeMount(){
                console.log("挂载前:");
                console.log(this.$el);
                console.log(this.$data);
            },
            mounted(){
                console.log("挂载完成:");
                console.log(this.$el);
                console.log(this.$data);
            },
            beforeUpdate(){
                console.log('=即将更新渲染=');
                let name = this.$refs.app.innerHTML;
                console.log('name:'+name);
            },
            updated(){
                console.log('==更新成功==');
                let name = this.$refs.app.innerHTML;
                console.log('name:'+name);
            },
            /*beforeDestory(){
                console.log("销毁前:");
            },
            destoryed(){
                console.log("销毁完成:");
            }*/
        });
    </script>
</html>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你提供的信息,这个错误似乎是由于在缓存界面返回到上一层时,尝试在未挂载的组件上调用setState方法而引起的。这个问题可能与使用了react-activation库的KeepAlive组件有关。 react-activation库的KeepAlive组件提供了缓存组件状态的功能,以便在组件被重新渲染时保留之前的状态。然而,由于组件被缓存起来,可能会导致在未挂载的组件上调用setState方法时出现问题。 为了解决这个问题,你可以尝试以下几种方法: 1. 在使用KeepAlive组件缓存的组件,确保在卸载(unmount)时重置状态。可以通过使用useEffect钩子的清理函数来实现。 ```javascript import { useEffect } from "react"; const YourComponent = () => { useEffect(() => { return () => { // 在组件卸载时重置状态 setState({ /* 初始状态 */ }); }; }, []); // 组件的渲染逻辑 }; ``` 2. 如果你需要在缓存组件保留状态,可以尝试使用useRef钩子来管理状态。useRef可以在组件重新渲染时保持其值不变,而不会触发组件的重新渲染。 ```javascript import { useRef } from "react"; const YourComponent = () => { const stateRef = useRef({ /* 初始状态 */ }); // 在需要更新状态时,直接修改stateRef.current的值 // stateRef.current = { /* 更新后的状态 */ }; // 组件的渲染逻辑 }; ``` 通过使用useEffect钩子的清理函数或useRef钩子来管理状态,可以避免在未挂载的组件上调用setState方法时出现错误。请根据你的具体需求选择适合的方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值