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+iview实现文件上传
Nov 17 Vue.js
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
vue3.0实现插件封装
Dec 14 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
vue组件是如何解析及渲染的?
Jan 13 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
详解Vue router路由
Nov 20 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
vue打包时去掉所有的console.log
Apr 10 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
德生9700DX电路分析
2021/03/02 无线电
php设计模式 Command(命令模式)
2011/06/26 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
smarty缓存用法分析
2014/12/16 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
PHP rmdir()函数的用法总结
2019/07/02 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
JS模式之单例模式基本用法
2015/06/30 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
2017/09/11 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python中logging包的使用总结
2018/02/28 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
战友聚会邀请函
2014/01/18 职场文书
高中数学教学反思
2014/01/30 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
施工安全协议书
2016/03/22 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js