vue监听返回按钮,改变返回后的页面中data的字段

博客围绕页面A和页面B导航问题展开,点击页面A的A3菜单跳转到页面B,返回A页面A3位置并改变data中“activeTabId”属性。给出三种解决方案,包括路径传参、本地存储和使用Vue钩子函数,推荐用钩子函数解决,可避免来回修改和传参问题。

问题描述:

        现在有页面A和页面B,页面A有三个菜单分别为A1,A2 ,A3,默认选中A1。点击页面A3同时 ,跳转到页面B,暂定A页面原属性“activeTabId”为“bardA”,然后点击页面B的返回按钮,返回到A页面中的A3位置(改变了默认选中,实现了记忆功能),返回成功后并改变页面A中data中的“activeTabId”属性为“bardB”

解决方案:                                                                                                

方案1:

         采用路径传参的方法。点击页面B的返回按钮通过路由配置this.$touter({path:"页面A",query{index:"参数1"}}),然后在页面A获取this.$router.query.index,通过该值判断,进而修改页面A中的‘activeTabId’为‘bardB’。

方案2:

        采用本地存储的方式,实现效果和方法1类似;

方案3:

         采用vue中的钩子函数(methods,watch ,created)解决。首先用watch监听“$route”  , 然后配置一个方法名暂定为“changeData” ,watch:{'$route':changeData} ,在methods中定义该方法名并重新赋值,changeData(){this.activeTabId = 'bardB' ; },在然后在created中初始化这个方法,created(){this.changeData()}, 具体代码如下

export default{
    data(){
        return{
            activeTabId:'boradA'
        }
    },
    created(){
         this.changeData()
    },
    watch:{
        '$route': 'changeData'
    },
    methods:{    
        changeData(){
            this.activeTabId = 'boradB';
        },
    }
}

总结:这样就不用在两个页面之间来回修改,同时也可以抛弃路径传参数的方式(如果参数很多,想想自己都后怕),更抛弃了用本地存储的方式,优点还是不少的,

备注:如果大家还有其他的方法,欢迎下方留言评论,谢谢!

 

 

### Vue3 WebSocket 实现页面实时监听服务器返回消息的最佳实践 在 Vue3 项目中实现 WebSocket 监听并处理服务器返回的消息,可以结合 Composition API 和事件总线(EventBus)来优化代码结构和可维护性。以下是一个完整的实现方案[^2]。 #### 1. 创建 WebSocket 服务封装 为了提高代码的复用性和可维护性,可以将 WebSocket 的逻辑封装为一个独立的服务模块。以下是 `websocketService.ts` 的实现: ```typescript // websocketService.ts import { reactive } from &#39;vue&#39;; const wsUrl = &#39;ws://localhost:8080&#39;; // 替换为实际的 WebSocket 服务器地址 export const useWebSocket = () => { const state = reactive({ socket: null, messages: [] as string[], // 存储接收到的消息 isConnected: false, // 连接状态 }); const connect = () => { state.socket = new WebSocket(wsUrl); state.socket.onopen = () => { console.log(&#39;WebSocket connection established&#39;); state.isConnected = true; }; state.socket.onmessage = (event) => { const message = JSON.parse(event.data); state.messages.push(message.content); // 假设消息内容为 content 字段 }; state.socket.onclose = () => { console.log(&#39;WebSocket connection closed&#39;); state.isConnected = false; }; state.socket.onerror = (error) => { console.error(&#39;WebSocket error:&#39;, error); }; }; const sendMessage = (data: any) => { if (state.socket && state.socket.readyState === WebSocket.OPEN) { state.socket.send(JSON.stringify(data)); } }; const disconnect = () => { if (state.socket) { state.socket.close(); } }; return { state, connect, sendMessage, disconnect }; }; ``` #### 2. 在组件中使用 WebSocket 服务 通过组合式 API,可以在 Vue3 组件中轻松集成 WebSocket 功能。以下是一个示例组件: ```vue <template> <div> <h1>WebSocket 实时通讯示例</h1> <input v-model="message" type="text" /> <button @click="sendMessage">发送消息</button> <ul> <li v-for="(msg, index) in messages" :key="index">{{ msg }}</li> </ul> </div> </template> <script lang="ts"> import { defineComponent, onMounted, onUnmounted, ref } from &#39;vue&#39;; import { useWebSocket } from &#39;./websocketService&#39;; export default defineComponent({ name: &#39;WebSocketExample&#39;, setup() { const { state, connect, sendMessage: sendWsMessage, disconnect } = useWebSocket(); const message = ref(&#39;&#39;); onMounted(() => { connect(); // 页面加载时连接 WebSocket }); onUnmounted(() => { disconnect(); // 页面卸载时断开连接 }); const sendMessage = () => { if (message.value.trim()) { const msg = { content: message.value }; sendWsMessage(msg); message.value = &#39;&#39;; // 清空输入框 } }; return { message, messages: state.messages, sendMessage, }; }, }); </script> ``` #### 3. 使用事件总线进行消息分发 如果需要在多个组件之间共享 WebSocket 消息,可以引入事件总线机制。以下是基于事件总线的改进版实现: ```typescript // eventBus.ts type Handler = (...args: any[]) => void; class EventBus { private subs: Record<string, Function[]> = Object.create(null); on(eventType: string, handler: Function) { this.subs[eventType] = this.subs[eventType] || []; this.subs[eventType].push(handler); } off(eventType: string, handler: Function) { if (this.subs[eventType]) { this.subs[eventType] = this.subs[eventType].filter(h => h !== handler); } } emit(eventType: string, ...args: any[]) { if (this.subs[eventType]) { this.subs[eventType].forEach(handler => handler(...args)); } } } export default new EventBus(); ``` 在 WebSocket 服务中触发事件: ```typescript // websocketService.ts import EventBus from &#39;./eventBus&#39;; const wsUrl = &#39;ws://localhost:8080&#39;; export const useWebSocket = () => { const state = reactive({ socket: null, }); const connect = () => { state.socket = new WebSocket(wsUrl); state.socket.onmessage = (event) => { const message = JSON.parse(event.data); EventBus.emit(&#39;newMessage&#39;, message); // 触发事件 }; }; // 其他方法... }; ``` 在组件中订阅事件: ```typescript import EventBus from &#39;./eventBus&#39;; setup() { const messages = ref<string[]>([]); const handleMessage = (message: any) => { messages.value.push(message.content); }; onMounted(() => { EventBus.on(&#39;newMessage&#39;, handleMessage); }); onUnmounted(() => { EventBus.off(&#39;newMessage&#39;, handleMessage); }); return { messages }; } ``` ### 注意事项 - 确保 WebSocket 服务器地址正确,并根据实际需求调整消息格式。 - 在生产环境中,建议添加断线重连机制以提高稳定性[^3]。 - 使用 TypeScript 时,确保为数据类型定义明确的接口,以减少运行时错误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值