美文网首页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-组件评论功能的实现

    效果图 起步 涉及知识: vue父子组件 定义以及传值 H5 localStorage JSON.stringif...

  • Vue父传子、子传夫通信--小案例

    父传子 子传夫 如有不懂,可以看我的 Vue-组件通信

  • 微信小程序评论功能

    小程序想要实现评论功能,想到的就是input 和 textarea这两个组件,简单说一下,这两个组件的区别 inp...

  • vue封装基础table表格

    table组件具有的功能/特点: table功能实现解析 1.选择render函数还是采用template实现组件...

  • 4 动画及组件

    vue-> 过渡(动画) (它的本质走的是css3: transtion ,animation) 组件 ...

  • Vue-基础-04-重点

    Vue-基础-day04-重点 01-基础-组件-局部组件 组件: 封装html+css+js 两类+三步 定义 ...

  • 实现v-model功能组件实例

    实现v-model功能组件实例 app.vue: 如图: 实现v-model功能组件官网上更简单的写法vModel...

  • React 实现组件拖拽功能

    ##实现React组件的拖拽功能 HTML5原生支持拖拽功能,没有看过相关文档,恰好自己想实现一下React组件...

  • Hexo评论功能的实现:Gitalk

    需求:1、用Gitalk实现评论功能2、去除之前的Valine实现的评论功能 可在主题配置文件搜索comment ...

  • 案例-(Vue组件)购物车

    1 实现组件化布局 把静态页面转换成组件化模式把组件渲染到页面上 2 实现 标题和结算功能组件 标题组件实现动态渲...

网友评论

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

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