刷新后如何保持localStorage值?

Posted

技术标签:

【中文标题】刷新后如何保持localStorage值?【英文标题】:How to keep localStorage values after refresh? 【发布时间】:2017-11-17 18:54:22 【问题描述】:

这是我的 ctrl:

app.controller('ctrl', function ($window, $scope) 

    $scope.initData = [
        
            firstName: "John",
            lastName: "Doe",  
        ,
        
            firstName: "Jane",
            lastName: "Doe",
        ,
        
            firstName: "John",
            lastName: "Smith",
        
    ];

    $window.localStorage.setItem('initData', JSON.stringify($scope.initData));
    $scope.retrievedData = JSON.parse($window.localStorage.getItem('initData'));
    $scope.sortedType = 'firstName';
    $scope.sortedReverse = false;
    //Remove Rows and Update localStorage Key Values
    $scope.removeRow = function(row) 
        $scope.retrievedData.splice(row, 1);
        $scope.initData.splice(row, 1);
        $window.localStorage.setItem('initData', JSON.stringify($scope.initData));
    
);

html

<table class="table table-bordered table-striped table-hover">
                <thead>
                <tr>
                    <th>
                        <span ng-show="sortedType == 'firstName' && sortedReverse" class="fa fa-long-arrow-up"></span>
                        <span ng-show="sortedType == 'firstName' && !sortedReverse" class="fa fa-long-arrow-down"></span>
                        <span href="#" ng-click="sortedType = 'firstName'; sortedReverse = !sortedReverse" style="cursor:pointer;">First Name</span>
                    </th>
                    <th>
                        <span ng-show="sortedType == 'lastName' && sortedReverse" class="fa fa-long-arrow-up"></span>
                        <span ng-show="sortedType == 'lastName' && !sortedReverse" class="fa fa-long-arrow-down"></span>
                        <span href="#" ng-click="sortedType = 'lastName'; sortedReverse = !sortedReverse" style="cursor:pointer;">Last Name</span>
                    </th>
            </tr>
            </thead>
            <tbody>
            <tr ng-repeat="(k, v) in retrievedData | orderBy: sortedType: sortedReverse">
                <td>v.firstName</td>
                <td>v.lastName</td>
                <td>
                    <button class="btn btn-primary">Edit</button>
                    <button class="btn btn-primary" ng-click="removeRow();">Delete</button>
                </td>
            </tr>
            </tbody>
        </table>

现在,我相信它的作用已经很清楚了。它将$scope.initData 中的数据分配给localStorage,然后将其插入HTML。函数removeRow() 删除表中的行并使用最新操作更新localStorage。问题在于,每次我重新加载 HTML 时,都会加载初始的 localStorage 数据,而不是更新的数据。我知道这是因为我在这里分配它:$window.localStorage.setItem('initData', JSON.stringify($scope.initData));但我不知道刷新后如何保持更新。

请指教。

谢谢。

【问题讨论】:

【参考方案1】:

您的线路$window.localStorage.setItem('initData', JSON.stringify($scope.initData)); 每次刷新时都会重置数据。

将这一行替换为:

if(!localStorage.getItem('initData'))
    $window.localStorage.setItem('initData', JSON.stringify($scope.initData));

此外,您根本不应该有那条线。从一个空的本地存储开始,仅从 UI 添加新条目。

上面的代码只运行一次,应用程序第一次运行。

如果您想在每次列表为空时重新插入数据,请尝试关注

if(!localStorage.getItem('initData') || JSON.parse(localStorage.getItem('initData')).length === 0)
    $window.localStorage.setItem('initData', JSON.stringify($scope.initData));

【讨论】:

我应该有这条​​线。我需要一些初始数据,因此这条线。 :) 那么你应该添加条件检查,看看是否没有数据然后只插入。 你还在吗?这有一个问题。 一个有趣的..你的答案不太正确,因为仍然有一个键'initData'只有一个空数组是一个值,也就是说,如果全部被删除:) 是的,它只会在应用程序第一次运行时插入。之后,当用户从 UI 中手动清除所有内容(使列表为空)时,我认为我们不应该重新插入数据。【参考方案2】:

在每次页面加载时,您都在设置新的 initData 并更新本地存储...相反,您应该检查现有的本地存储数据并在使用模拟的 initData 之前使用它

【讨论】:

【参考方案3】:

如果您的 localStorage 在加载时为空,您需要检查首先

if (localStorage == null) //setItem() ...;

【讨论】:

你的意思是if (localStorage == null) ;? :) 是的!对不起错字;检查您的 localoStorage 是否不为空,如果它为空,则可以 setItem【参考方案4】:

使用 javascript 从本地存储中删除数据 这是您的代码,没有通过错误。

使用删除功能

       function deleteRow(index)
              dataList.splice(index, 1);
              console.log('====>', dataList)
              localStorage.setItem('items', JSON.stringify(dataList)); 

【讨论】:

最容易理解的dataList是数组,这里我的对象被推送了 items 是键名(databaseName)【参考方案5】:

此代码将帮助您理解.....

<!DOCTYPE html>
    <html>
    <head>
    <script>
    var ArrayData = [];
    function clickCounter() 
        if(typeof(Storage) !== "undefined") 
            if (localStorage.count) 
                localStorage.count = Number(localStorage.count)+1;
             else 
                localStorage.count = 1;
            
            document.getElementById("result").innerHTML = "You have clicked the button " + localStorage.count;
         else 
            document.getElementById("result").innerHTML = "Sorry, your browser does not support web storage...";
        
    
    function load()
    
        var odser = JSON.parse(localStorage.getItem("data"));
        document.getElementById("result1").innerHTML = odser;
    
    function fun()
    
        var odser = JSON.parse(localStorage.getItem("data"));
        ArrayData = odser;
        ArrayData.push(3);
        var oser = JSON.stringify(ArrayData);
        localStorage.setItem("data", oser);
        var odser = JSON.parse(localStorage.getItem("data"));
        document.getElementById("result1").innerHTML = odser;
    
    </script>
    </head>
    <body onload="load()">
    <button onclick="clickCounter()" type="button">Click me!</button>
    <button onclick="fun()" type="button">Click me! Array</button>
    <div id="result"></div>
    <div id="result1"></div>
    </body>
    </html>

【讨论】:

【参考方案6】:

在简单的步骤中,您需要如何使用刷新功能来刷新页面,这对我来说很方便有效,并保持 locaStorage 值设置..我使用....下面的函数调用它作为 load() 和它对我有用

    function load()

  console.log("loading")
  setTimeout("window.location.assign('samepage.html');", 1000);


【讨论】:

【参考方案7】:

几个月来我一直面临同样的问题。最后我找到了解决方案。 (我不确定这对你来说是否是同样的问题,无论如何分享我的场景)

当我在本地主机上进行测试时,我使用 URL 作为 http://localhost:3000/ 来加载页面。但是在登录时,页面刷新后,我实际上是使用IP地址来重定向页面,就像http://192.163.1.31:3000/。

所以结果,http://localhost:3000/的本地存储包含我保存的值,但http://192.163.1.31:3000/的本地存储不包含我保存的值。

所以我通过在整个启动过程中使用相同的 URL 来修复解决方案,直到页面加载。问题得到了解决。 (我用http://192.163.1.31:3000/而不是http://localhost:3000/)

对于你的情况,重新加载页面后检查URL是否不同。如果是,修复它,你的问题可能不会持续

【讨论】:

以上是关于刷新后如何保持localStorage值?的主要内容,如果未能解决你的问题,请参考以下文章

页面刷新后如何让JS变量保留值? [复制]

刷新后保持折叠状态

浏览器刷新后如何保持 React 组件状态

如何在 React.js 中刷新页面后保持状态?

vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息

如何在使用 jquery 刷新页面后保持复选框在模式中的选中状态?