vue使用localStorage持久性存储实现评论列表


Posted in Vue.js onApril 14, 2022

案例数据使用localStorage持久性存储 全局过滤器实现时间格式化

代码部分

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title></title>
        <script src="../lib/vue.js" type="text/javascript" charset="utf-8"></script>
        <link rel="stylesheet" type="text/css" href="../node_modules/bootstrap/dist/css/bootstrap.css" rel="external nofollow"  />
    </head>
    <body>
        <div id="app">
            <div class="container">
                <div class="row">
                    <div class="col-md-6 offset-md-3">
                        <cmt-box @func="loadComments"></cmt-box>
                        <ul class="list-group">
                            <li class="list-group-item" v-for="item in list" :key="item.id">
                                <span class="badge badge-pill badge-dark float-right">评论人:{{item.user}}</span>
                                <span class="float-right" style="position: relative;right: 60px;">{{ item.ctime | dateFormat() }}</span>
                                {{item.content}}
                            </li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>

        <template id="tmpl">
            
            <div>
                <div class="form-group">
                    <label for="comment">评论人:</label>
                    <input type="text" id="comment" class="form-control" v-model="user" />
                </div>
                
                <div class="form-group">
                    <label for="commentText">评论内容:</label>
                    <textarea id="commentText" class="form-control" v-model="content">
                
                    </textarea>
                </div>
                
                <div class="form-group">
                    <input type="button" value="发表评论" class="btn btn-primary" @click="postComment" />
                </div>
            </div>
            
        </template>


        <script type="text/javascript">
            
            // 全局过滤器 时间格式化
            // 所谓的全局过滤器,就是所有的VM实例都共享的
            Vue.filter('dateFormat',function(dateStr,pattern=""){
                 // 根据给定的时间字符串,得到特定的时间
                 
                var dt = new Date(dateStr)
                
                //   yyyy-mm-dd
                var year = dt.getFullYear()
                
                var month = (dt.getMonth() + 1).toString().padStart(2,'0')
                
                var day = dt.getDate().toString().padStart(2,'0')
                
                // return `${year}-${month}-${day}`
                
                if(pattern && pattern.toLowerCase() === 'yyyy-mm-dd'){
                    return `${year}-${month}-${day}`
                }else{
                    var hh = dt.getHours().toString().padStart(2,'0')
                    
                    var mm = dt.getMinutes().toString().padStart(2,'0')
                    
                    var ss = dt.getSeconds().toString().padStart(2,'0')
                    
                    return `${year}-${month}-${day} ${hh}:${mm}:${ss}`
                    
                }
                
            })
            
            var commentBox = {
                data() {
                    return {
                        user: '',
                        content: '',
                        ctime:new Date()
                    }
                },
                template: '#tmpl',
                methods: {
                    postComment() {
                        //  localStorage 只支持存放字符串数据, 要先调用 JSON.stringify 
                        //  在保存 最新的 评论数据之前,要先从 localStorage 获取到之前的评论数据(string), 转换为 一个  数组对象, 然后,把最新的评论, push 到这个数组
                        //  如果获取到的 localStorage 中的 评论字符串,为空不存在, 则  可以 返回一个 '[]'  让 JSON.parse 去转换
                        //  把 最新的  评论列表数组,再次调用 JSON.stringify 转为  数组字符串,然后调用 localStorage.setItem()

                        var comment = {
                            id: Date.now(),
                            user: this.user,
                            content: this.content,
                            ctime:this.ctime
                        }
                        
                        // 从 localStorage 中获取所有的评论
                        var list = JSON.parse(localStorage.getItem('cmts') || '[]')

                        list.unshift(comment)

                        // 重新保存最新的 评论数据
                        localStorage.setItem('cmts', JSON.stringify(list))

                        this.user = this.content = ''

                        this.$emit('func')

                    }
                }
            }

            var vm = new Vue({
                el: '#app',
                data: {
                    list: []
                },
                methods: {
                    loadComments() {
                        // 从本地的 localStorage 中,加载评论列表
                        var list = JSON.parse(localStorage.getItem('cmts') || '[]')

                        this.list = list

                    }
                },
                components: {
                    'cmt-box': commentBox
                },
                created() {
                    this.loadComments()
                }
            })
        </script>

    </body>
</html>

效果图

vue使用localStorage持久性存储实现评论列表

Vue.js 相关文章推荐
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
vue中如何自定义右键菜单详解
Dec 08 Vue.js
vue监听滚动事件的方法
Dec 21 Vue.js
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
vue.js watch经常失效的场景与解决方案
Jan 07 Vue.js
vue动态设置路由权限的主要思路
Jan 13 Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 #Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 #Vue.js
vue elementUI表格控制对应列
Apr 13 #Vue.js
vue项目打包后路由错误的解决方法
Apr 13 #Vue.js
vue的项目如何打包上线
vue2的 router在使用过程中遇到的一些问题
Apr 13 #Vue.js
vue+elementUI实现表格列的显示与隐藏
Apr 13 #Vue.js
You might like
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
php常用表单验证类用法实例
2015/06/18 PHP
十大使用PHP框架的理由
2015/09/26 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
页面中js执行顺序
2009/11/09 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
2014/03/20 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
web字体加载方案优化小结
2019/11/29 HTML / CSS
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python
Python装饰器详细介绍
2022/03/25 Python