使用react写一个简单的评论系统

简介: 使用react写一个简单的评论系统

使用react写一个简单的评论系统

首先初始化项目

1. npm install -g create-react-app  // 已安装可以跳过
2. create-react-app my-app
3. cd my-app
4. npm start

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import * as commonList from './commonList';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <commonList.commonHead />
);
reportWebVitals();

commonList

import React from "react";
import * as base64 from './base64'
// 评论内容
class Content extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            value:''
        }
    }
    returnCommon() {
        let date = new Date()
        let list = this.props.list
        // this.props.list = []
        // console.log(typeof this.props.list)
        list.push({
            name:'user999',
            content:this.state.value,
            date:date.getFullYear()+'/'+(date.getMonth()+1)+'/'+date.getDate()+' '+date.getHours()+':'+date.getMinutes()+':'+date.getSeconds()
        })
        this.props.setSelfState(list)
    }
    //文本框双向绑定
    changeText=(ev)=>{
        // this.state.textvalue = ev.target.value;
        this.setState({
            value:ev.target.value
        })
    }
    // 删除
    removeFun(index) {
        let list = this.props.list
        list.splice(index,1)
        this.props.setSelfState(list)
    }
    render() {
        return (
            <div>
                <div className='content'>
                    <img className='img' src={base64.avatar} />
                    <div className='right'>
                        <textarea onChange={this.changeText.bind(this)}  placeholder='发条友善的评论' />
                        <button onClick={this.returnCommon.bind(this)}>发表<br />评论</button>
                    </div>
                </div>
                {
                    this.props.list.map((item,index) => {
                        return <div key={item.name} className='content core'>
                            <img className='img' src={base64.avatar} />
                            <div className='right'>
                                <div className='name'>{item.name}</div>
                                <div className='substance'>{item.content}</div>
                                <div className="date-remove">
                                    <div className='create-date'>{item.date}</div>
                                    <div className="remove" onClick={this.removeFun.bind(this,index)}>删除</div>
                                </div>
                                <div className="line"></div>
                            </div>
                        </div>
                    })
                }
            </div>
        )
    }
}
// 评论
class commonHead extends React.Component {
    constructor() {
        super();
        let list = [
            {
                name:'五月天',
                content:'不打扰,是我的温柔',
                date:'2022/10/11 10:59:20',
            },
            {
                name:'周杰伦',
                content:'哎哟,不错哦',
                date:'2022/10/12 10:59:20',
            },
            {
                name:'刘德华',
                content:'给我一杯忘情水',
                date:'2022/10/13 10:59:20',
            }
        ]
        this.state = {
            num:3,
            active:0,
            content: list,
            list: list,
            listTwo: [
                {
                    name:'lzw',
                    content:'我打',
                    date:'2022/08/11 10:59:20',
                },
                {
                    name:'xhy',
                    content:'套你猴子',
                    date:'2022/02/12 09:59:20',
                },
                {
                    name:'ll',
                    content:'老六',
                    date:'2022/05/13 10:10:20',
                }
            ]
        }
        this.setSelfState =this.setSelfState .bind(this)
    }
    activeClick(active,e) {
        this.setState({
            active:active,
            content:active === 0?this.state.list:this.state.listTwo
        })
    }
    setSelfState(list) {
        this.setState({
            content: list
        })
    }
    render() {
        return (
            <div className="common">
                <div className="title">{this.state.content.length} 评论</div>
                <div className="header">
                    <div onClick={this.activeClick.bind(this,0)} className={this.state.active === 0?'active':''}>按热度排序</div>
                    <div onClick={this.activeClick.bind(this,1)} className={this.state.active === 1?'active':''}>按时间排序</div>
                </div>
                <Content list={this.state.content} setSelfState={this.setSelfState.bind(this)} />
            </div>
        )
    }
}
export {commonHead}

index.css

body {
  padding: 30px;
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
    sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
code {
  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
    monospace;
}
.common .title {
  font-weight: bold;
  margin-bottom: 20px;
}
.common .header {
  display: flex;
}
.common .header div {
  cursor: pointer;
  font-weight: bold;
  padding-bottom: 10px;
}
.common .header div.active {
  color: royalblue;
  border-bottom: 1px solid royalblue;
}
.common .header div:first-child {
  margin-right: 25px;
}
.content {
  align-items: flex-start;
  display: flex;
  margin: 30px 10px;
}
.content .img {
  margin-right: 20px;
  width: 50px;
  border-radius: 50%;
  height: 50px;
}
.content .right {
  display: flex;
  width: 100%;
}
.content .right textarea {
  width: 100%;
  padding: 10px;
  border: 0px;
  min-height: 50px;
  border-radius: 5px;
  background-color: #eee;
}
.content .right button {
  border: 0px;
  width: 80px;
  border-radius: 5px;
  color: #ffffff;
  padding: 10px;
  background-color: royalblue;
}
.core .right {
  justify-content: space-between;
  flex-direction: column;
}
.core .right .name {
  font-size: 12px;
}
.core .right .substance {
  margin: 5px 0;
}
.core .right .create-date {
  font-size: 10px;
  color: darkgray;
}
.core .right .line {
  border-bottom: 1px solid darkgray;
  margin-top: 15px;
}
.date-remove {
  display: flex;
}
.date-remove .remove {
  cursor: pointer;
  margin-left: 20px;
  font-size: 10px;
  color: red;
  opacity: 0.7;
}

项目下载:https://download.csdn.net/download/qq_27161847/86399363

预览:http://static-bde677f3-bc6a-4e10-a5bb-c942bc3ca59a.bspapp.com/


相关文章
|
5月前
|
前端开发 NoSQL Java
杨校老师项目之基于SpringBoot+React框架开发的医院挂号管理系统
杨校老师项目之基于SpringBoot+React框架开发的医院挂号管理系统
69 0
|
6月前
|
前端开发
【边做边学】系统解读一下React Hooks
【边做边学】系统解读一下React Hooks
|
资源调度 前端开发 API
用 React 构建可复用的设计系统(一)
用 React 构建可复用的设计系统
107 0
|
6月前
|
JavaScript 前端开发 开发者
React和Vue的生态系统有何不同?
React和Vue的生态系统有何不同?
|
6月前
|
前端开发 JavaScript API
React 生态系统:路由、状态管理、调试、测试、组件库、文档……
React 生态系统:路由、状态管理、调试、测试、组件库、文档……
113 0
|
开发框架 缓存 前端开发
基于.NetCore+React单点登录系统
基于.NetCore+React单点登录系统
90 0
|
前端开发
🔔叮~,你有几个系统级交互的React hooks待查收
🔔叮~,你有几个系统级交互的React hooks待查收
|
设计模式 缓存 前端开发
|
前端开发 API
用 React 构建可复用的设计系统(二)
用 React 构建可复用的设计系统
88 0
|
JavaScript 前端开发
响应式系统与react——字节青训营
响应式系统与react——字节青训营
84 0