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中音频wavesurfer.js的使用方法
Feb 20 Vue.js
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
Vue如何循环提取对象数组中的值
Nov 18 Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
Vue如何实现变量表达式选择器
Feb 18 Vue.js
vue引入Excel表格插件的方法
Apr 28 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
Vue Mint UI mt-swipe的使用方式
Jun 05 Vue.js
Vue Element plus使用方法梳理
Dec 24 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
php实现上传图片保存到数据库的方法
2015/02/11 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
python 装饰器重要在哪
2021/02/14 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
经济管理专业毕业生推荐信
2013/11/11 职场文书
绿色环保标语
2014/06/12 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
小时代观后感
2015/06/10 职场文书
2015年重阳节主持词
2015/07/04 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
JS class语法糖的深入剖析
2022/07/07 Javascript