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 18 Vue.js
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
vue postcss-px2rem 自适应布局
May 15 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
PHP图片上传代码
2013/11/04 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
php + WebUploader实现图片批量上传功能
2019/05/06 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
js 判断 enter 事件
2009/02/12 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
JavaScript 继承详解(五)
2016/10/11 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
详解jquery和vue对比
2019/04/16 jQuery
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
python批量同步web服务器代码核心程序
2014/09/01 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
python之生成多层json结构的实现
2020/02/27 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
python Timer 类使用介绍
2020/12/28 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
安全生产投入制度
2014/01/29 职场文书
教师教学评估方案
2014/05/09 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
比赛主持人开场白
2015/05/29 职场文书
余世维讲座观后感
2015/06/11 职场文书