美文网首页vue
vue-组件评论功能的实现

vue-组件评论功能的实现

作者: _章鱼丸子 | 来源:发表于2019-11-19 10:45 被阅读0次

    效果图

    效果图

    起步

    涉及知识:

    • <code>vue父子组件</code>定义以及传值
    • <code>H5 localStorage</code>
    • <code>JSON.stringify()</code>和<code>JSON.parse()</code>

    效果分析

    页面构成

    • 父组件包含评论列表
    • 子组件包含评论人、评论内容以及评论时间


      页面结构

    发表评论功能[子组件]

    1. 先组织出一个最新的评论数据 如:<code>{user:'张三',content:'今天天气不错~'}</code>
    2. 定义变量<code>var list</code>。先从localStorage获取到之前评论数据(string),转换为一个数组对象,<code>JSON.parse()</code>【从一个字符串中解析出json对象,再<code>localStorage.getItem('cmts')||'[]'</code>
    3. 把组织出的最新的评论数据push至list数组 如:<code>list.unshift(最新的评论数据)</code>
      注:unshift()-----向数组的开头添加一个或多个元素,并且返回新的长度
    4. 把第一步得到的评论数据,保存到localStorage中
      <code>注:</code>
      4.1 localStorage只支持存放字符串数据,要先JSON.stringify。JSON.stringify()【从一个对象中解析出字符串】
      4.2 把最新的评论列表数组,存入本地存储localStorage中,首先调用JSON.stringify转为数据字符串【localStorage只支持存放字符串数据】,然后调用localStorage.setItem('','')
    5. 父组件把加载评论功能传递给子组件(子组件可以调用父组件函数),点击发表评论,从本地的localStoage中,加载评论列表 <code>$emit()</code>

    加载评论列表[父组件]

    1. 定义变量<code>var list</code>。先从localStorage获取到之前评论数据(string),转换为一个数组对象,<code>JSON.parse()</code>【从一个字符串中解析出json对象,再<code>localStorage.getItem('cmts')||'[]'</code>
    2. created()钩子函数开始执行时,从本地的localStoage中取出数据,加载评论列表

    代码实现

    页面构成

    注:这里的样式均引用<code>bootstrap</code>

    <div id="app">
        <!--调用定义子组件 && 定义父组件函数-->
        <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">评论人:{{item.user}}</span>
                {{item.content}}
            </li>
        </ul>
        
    </div>
    <!--子组件:评论人、评论内容以及评论时间-->
    <template id="tmp1">
        <div>
            <div class="form-group">
                <label>评论人:</label>
                <input type="text" class="form-control" v-model="user">
            </div>
            <div class="form-group">
                <label>评论内容:</label>
                <textarea 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>
    
    var commentBox={     //定义子组件
        template:'#tmp1',     //定义子组件模板对象
        data(){
            return {
                user:'',      //评论人 
                content:''    //评论内容
            }
        },
    }
    
    var vm=new Vue({   //父组件
        el:'#app',
        data:{
            list:[
                /*假数据*/
                {id:Date.now(),user:'李白',content:'天生我材必有用'},
                {id:Date.now(),user:'江小白',content:'劝君更尽一杯酒'}
            ]
        },
        /*注册子组件*/
        components:{
            'cmt-box':commentBox
        }
        });
    </script>
    

    发表评论功能[子组件]

    methods:{
        /*点击发表评论按钮触发函数*/
        postComment(){
            /*组织出一个最新的评论数据*/
            var comment={id:Date.now(),user:this.user,content:this.content}
    
            /*localStorage获取到之前评论数据(string),转换为一个数组对象*/
            var list=JSON.parse(localStorage.getItem('cmts')||'[]')
    
            /*把组织出的最新的评论数据push至list数组*/
            list.unshift(comment)
    
            /*重新保存最新的评论*/
            localStorage.setItem('cmts',JSON.stringify(list))
    
            /*清空输入框*/
            this.user=this.content=''
    
            /*子组件调用父组件加载评论列表功能函数*/
            this.$emit('func')
        }
    }
    

    localStorage存入效果:[点击f12查看]

    localStorage

    加载评论列表[父组件]

    methods:{
        /*加载评论列表*/
        loadComments(){ 
            /*从本地的localStoage中,加载评论列表*/
            var list=JSON.parse(localStorage.getItem('cmts')||'[]')
            this.list=list
        }
    },
    /*页面刚加载执行函数*/
    created(){
        this.loadComments()
    },
    

    完整代码

    <!DOCTYPE html>
    <html lang="en">
    <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="vue.js"></script>
        <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
    </head>
    
    <body>
        <div id="app">
            <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">评论人:{{item.user}}</span>
                    {{item.content}}
                </li>
            </ul>
            
        </div>
    
        <template id="tmp1">
            <div>
                <div class="form-group">
                    <label>评论人:</label>
                    <input type="text" class="form-control" v-model="user">
                </div>
                <div class="form-group">
                    <label>评论内容:</label>
                    <textarea 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>
            var commentBox={
                template:'#tmp1',
                data(){
                    return {
                        user:'',
                        content:''
                    }
                },
                methods:{
                    postComment(){
                        var comment={id:Date.now(),user:this.user,content:this.content}
                        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:[
                       {id:Date.now(),user:'李白',content:'天生我材必有用'},
                       {id:Date.now(),user:'江小白',content:'劝君更尽一杯酒'},
                       {id:Date.now(),user:'小马',content:'我姓马,风吹草低见牛羊'}
                   ]
               },
               methods:{
                   loadComments(){
                     var list=JSON.parse(localStorage.getItem('cmts')||'[]')
                     this.list=list
                   }
               },
               created(){
                   this.loadComments()
               },
               components:{
                   'cmt-box':commentBox
               }
            });
        </script>
    </body>
    
    </html>
    

    小结

    • vue父子组件传函数方法:
      • 父组件定义函数---loadComments(){ …… }
      • 子组件定义父组件函数方法---@func="loadComments"
      • 子组件引用父组件函数方法---this.$emit('func')
    • H5 localStorage:
      • localStorage中一般浏览器支持的是5M大小
      • localStorage.setItem("key","value"):存储名字为key的一个值value,如果key存在,就更新value
      • localStorage.getItem("key"):获取名称为key的值,如果key不存在则返回null
      • localStorage.removeItem("key"):删除名称为"key"的信息,这个key所对应的value也会全部被删除
      • localStorage.clear():清空localStorage中所有信息
    • JSON.stringify()和JSON.parse()
      • JSON.parse(); 将字符串格式转换成JSON对象进行处理
      • JSON.stringify(); 将JSON对象转换成字符串格式

    来源我的博客:我的博客

    相关文章

      网友评论

        本文标题:vue-组件评论功能的实现

        本文链接:https://www.haomeiwen.com/subject/frkwictx.html