React实现评论的添加和删除


Posted in Javascript onOctober 20, 2020

本文实例为大家分享了React实现评论添加和删除的具体代码,供大家参考,具体内容如下

一、效果图

React实现评论的添加和删除

React实现评论的添加和删除

React实现评论的添加和删除

React实现评论的添加和删除

二、需求描述

1. 手动输入用户名和评论内容,点击提交;输入内容被追加到右侧评论列表;

2.  点击评论列表的“删除”按钮,弹框提示确定删除用户“xx”;

3. 点击“确定”,“xx”用户发表的评论被删除;

4. 所有评论均被删除时,显示“暂无评论,点击添加评论!!!”

三、代码实现

App.js

import React from 'react';
import './App.css';
import CommentAdd from '../src/components/CommentAdd'
import CommentList from '../src/components/CommentList'
import PropTypes from 'prop-types'
import "../src/assets/css/bootstrap.css"
 
class App extends React.Component {
 // 给组件对象指定state属性
 // 初始化状态
 state = {
 comments: [
  {username: "Tom", content: "React太容易了"},
  {username: "Jack", content: "React太难了"}
 ]
 }
 
 static propTypes = {
 comments: PropTypes.array.isRequired,
 addComment: PropTypes.func.isRequired,
 deleteComment: PropTypes.func.isRequired
 }
 
 addComment = (comment) => {
 // 将添加的评论追加到评论list上
 const {comments} = this.state
 comments.unshift(comment)
 // 更新状态
 this.setState({comments})
 }
 deleteComment = (index) => {
 const {comments} = this.state
 comments.splice(index, 1)
 this.setState({comments})
 }
 
 render() {
 const {comments} = this.state
 return (
  <div>
  <header className="site-header jumbotron">
   <div className="container">
   <div className="row">
    <div className="col-xs-12">
    <h2>评论管理列表</h2>
    </div>
   </div>
   </div>
  </header>
  <div className="container">
   <CommentAdd addComment={this.addComment}/>
   <CommentList comments={comments} deleteComment={this.deleteComment}/>
  </div>
  </div>
 );
 }
}
 
export default App;

CommentAdd.js

import React, {Component} from 'react';
import PropTypes from 'prop-types'
import "../assets/css/bootstrap.css"
 
class CommentAdd extends Component {
 
 state = {
 username: "",
 content: ""
 }
 
 static propTypes = {
 addComment: PropTypes.func.isRequired
 }
 handleNameChange = (event) => {
 const username = event.target.value
 this.setState({username});
 }
 handleContentChange = (event) => {
 const content = event.target.value
 this.setState({content});
 }
 handleSubmit = () => {
 const comment = this.state
 this.props.addComment(comment)
 // 清楚输入数据
 this.setState({
  username: "",
  content: ""
 });
 }
 
 render() {
 const {username, content} = this.props
 return (
  <div className="col-md-4">
  <form className="form-horizontal">
   <div className="form-group">
   <label>用户名:</label>
   <input type="text" className="form-control" placeholder="请输入用户名" value={username}
    onChange={this.handleNameChange}/><br/>
   </div>
   <div className="form-group">
   <label>评论内容:</label>
   <textarea className="form-control" rows="6" placeholder="请输入评论内容"
     value={content} onChange={this.handleContentChange}>
   </textarea>
   </div>
   <div className="form-group">
   <div className="col-sm-offset-2 col-sm-10">
    <button type="button" className="btn btn-default pull-right"
     onClick={this.handleSubmit}>提交
    </button>
   </div>
   </div>
  </form>
  </div>
 );
 }
}
 
export default CommentAdd;

CommentList.js

import React, {Component} from 'react';
import CommentItem from "./CommentItem";
import PropTypes from 'prop-types'
import "../assets/css/comment_list.css"
 
class CommentList extends Component {
 
 static propTypes = {
 comments: PropTypes.array.isRequired,
 deleteComment: PropTypes.func.isRequired
 }
 
 render() {
 const {comments, deleteComment} = this.props
 const display = comments.length === 0 ? "block" : "none"
 return (
 
  <div className="col-md-8">
  <h4>评论回复:</h4>
  <h5 style={{display}}>暂无评论,点击添加评论!!!</h5>
  <ul>
   {
   comments.map((comment, index) => <li key={index}><CommentItem comments={comment} index={index}
           deleteComment={deleteComment}/>
   </li>)
   }
  </ul>
  </div>
 );
 }
}
 
export default CommentList;

CommentItem.js

import React, {Component} from 'react';
import PropTypes from 'prop-types'
import "../assets/css/comment_item.css"
 
class CommentItem extends Component {
 static propTypes = {
 comments: PropTypes.array.isRequired,
 deleteComment: PropTypes.func.isRequired,
 index: PropTypes.number.isRequired
 }
 
 handleDeleteComment = () => {
 const {comments, deleteComment, index} = this.props
 if (window.confirm(`确定删除${comments.username}嘛?`)) {
  deleteComment(index)
 }
 }
 
 render() {
 const {comments} = this.props
 return (
  <div className="list-group-item">
  <div className="handle">
   <a href="javascript:;" rel="external nofollow" onClick={this.handleDeleteComment}>删除</a>
  </div>
  <p className="user"><span>{comments.username}</span><span>说:</span></p>
  <p className="centence">{comments.content}</p>
  </div>
 );
 }
}
 
export default CommentItem;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中实现块作用域的方法
Apr 01 Javascript
Javascript小技巧之生成html元素
May 15 Javascript
jQuery中live()方法用法实例
Jan 19 Javascript
JavaScript实现打字效果的方法
Jul 10 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
Apr 20 Javascript
JavaScript ES6中CLASS的使用详解
Nov 22 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
node.js express捕获全局异常的三种方法实例分析
Dec 27 Javascript
JS中准确判断变量类型的方法
Jun 01 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 Javascript
在vue中使用Echarts画曲线图的示例
Oct 03 Javascript
原生JS实现音乐播放器
Jan 26 Javascript
基于JavaScript实现简单抽奖功能代码实例
Oct 20 #Javascript
微信小程序使用前置摄像头拍照
Oct 22 #Javascript
jQuery实现可以计算进制转换的计算器
Oct 19 #jQuery
jQuery实现计算器功能
Oct 19 #jQuery
vue3为什么要用proxy替代defineProperty
Oct 19 #Javascript
jQuery实现推拉门效果
Oct 19 #jQuery
小程序实现左滑删除的效果的实例代码
Oct 19 #Javascript
You might like
PHP入门
2006/10/09 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
两个Javascript小tip资料
2010/11/23 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
Python sys.path详细介绍
2013/10/17 Python
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
python gdal安装与简单使用
2019/08/01 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
python中的yield from语法快速学习
2020/11/06 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
关于责任的演讲稿
2014/05/20 职场文书
员工团队活动方案
2014/08/28 职场文书
小石潭记导游词
2015/02/03 职场文书
高三毕业感言
2015/07/30 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
python使用glob检索文件的操作
2021/05/20 Python