导航回页面时,VueReact性失败

gzszwxb4  于 2023-01-14  发布在  Vue.js
关注(0)|答案(2)|浏览(115)

我使用一个简单的名为binary_state的二进制Vue变量来控制元素的类,在本问题的其余部分中,该按钮名为“controlled_element”。“controlled_element”有两个类“class_true”和“class_fasle”,由binary_state的值确定。binary_state的值本身使用页面上的按钮在true和false之间切换。我们将该按钮称为“控制_元素”。
每次使用“controlling_element”更改binary_state的值时,更新后的值都会发送到服务器。另一方面,每次刷新页面时,都会从服务器获取binary_state的更新值。一旦发生这种情况,“controlled_element”的类也会进行调整。
这是一个非常简单的场景,现在考虑以下步骤:
1.刷新页面,从服务器获取新值binary_state,为简单起见,假设新值为true,即binary_state=true,这将把“controlled_element”的类设置为“class_true”。
1.按下“控制元素”奇数次。这将分别设置binary_state和“受控元素”的类为“假”和“类假”。
1.使用浏览器的后退箭头(按钮)离开页面并返回到该页面。
1.我希望binary_state的值继续为false,这 * 看起来 * 是实际情况,正如Vue devtool插件所示。
1.我还期望“controlled_element”的类继续为“class_false”,但是,令我惊讶的是,该类为“class_true”,这是从服务器接收到的最新值,而不管在步骤2中应用了哪些更改。
请注意,当导航回页面时,binary_state和“controlled_element”类之间的同步(React性)被违反:如上面的步骤4所述,binary_state的值继续为false(如Vue devtool插件所指示的),但“controlled_element”的类为“class_true”。

**注意。*我在chrome(版本108.0.5359.125(官方版本)(64位))和Edge(版本108.0.1462.76(官方版本)(64位))中看到过这个问题,但在Firefox(版本108.01.1(64位))中, 一切 * 都很好。

最后三点。

  • 我看过这个相关的question。作者表示他们能够通过设置表单的autocomplete="on"来解决这个问题。我不确定这是否对我有帮助,因为我开始没有表单。
  • 我看到了一些关于使用vuexlocalStorage的建议,但我不确定在我的情况下是否有必要这样做,因为正如第4步中提到的,Vue值binary_state似乎具有正确的值。
  • 我 * 不 * 使用vue-router,如果这与这个主题有关的话。
js81xvg6

js81xvg61#

好吧,老实说,根据您使用的vue版本,我有一些建议,例如,如果您使用Vue2Vue3与cli,您的状态管理问题可以使用Vuex解决(但是现在vuex不再是官方推荐的状态管理系统).如果您使用Vue3,最好的解决方案是是与Piniahttps://pinia.vuejs.org一起使用,与Vuex相比,Pinia非常有帮助,非常现代,而且令人惊讶地更容易学习和使用。
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStoragelocalStorage是一种替代解决方案,但代价是您必须编写代码来擦除该localStorage
https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStoragesessionStorage类似于localStorage,但在窗口关闭后会自动擦除数据。

ulydmbyx

ulydmbyx2#

我解决这个问题的方法是,当用户使用浏览器的后退/前进按钮访问页面时,手动重新加载页面。

<script>
    if (performance) {
        // get the PerformanceNavigationTiming object
        const perfEntries = performance.getEntriesByType("navigation");
        const perfNavTiming = perfEntries && perfEntries[0];

        if (perfNavTiming) {
            // get the type of navigation
            const navType = perfNavTiming.type;

            // reload if it is back_forward or prerender.
            if ((navType === "back_forward") ||
                (navType === "prerender")) {
                window.location.reload();
            }
        }
    }

</script>

这不是最好的解决方案,但考虑到我的时间限制,我想我应该尝试一下,我想在使用建议的localStoragesessionStoragePiani解决方案之前还需要一些学习,因为我不确定如何使用这些技术重新启动Vue双向绑定。

相关问题