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项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
vue实现表格合并功能
Dec 01 Vue.js
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
Vue监视数据的原理详解
Feb 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
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
php单链表实现代码分享
2016/07/04 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
jQuery中get和post方法传值测试及注意事项
2014/08/08 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
Python continue语句用法实例
2014/03/11 Python
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
python http接口自动化脚本详解
2018/01/02 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
类和结构的区别
2012/08/15 面试题
春风行动实施方案
2014/03/28 职场文书
班级读书活动总结
2014/06/30 职场文书
歌舞青春观后感
2015/06/10 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js