【 React -- 2/100 】使用React实现评论功能
React| 组件化 | 递归 | 生成唯一ID
需要探究一下 .find() 和 findIndex() 的区别
import React from 'react'
import './commentsDemo.css'
class CommentsDemo extends React.Component{
// 初始化状态
state = {
comments: [
{ id: 1, name: 'cnyangx', content: '前排出售瓜子、汽水、辣条!!!' },
{ id: 2, name: '大脸猫', content: '沙发~' },
{ id: 3, name: '老张', content: '我有酒,你有故事吗' }
],
userName: '',
userContent: ''
};
handleForm = (e) => {
this.setState({
[e.target.name] : e.target.value
})
};
// 验证id唯一性
verifyID = () => {
const newID = Math.floor(Math.random() * 100000);
const flag = this.state.comments.find( item => item.id === newID);
console.log(flag)
if(flag === -1){
this.verifyID()
}
return newID;
};
// 发表评论
publishComments = () => {
const {comments, userName, userContent} = this.state;
if(userName.trim()==='' || userContent.trim() === ''){
alert('请输入内容');
return
}
// 将新的评论添加到集合中
const newComments = [
{
id: this.verifyID(),
name: userName,
content: userContent
},
...comments
];
console.log(newComments);
this.setState({
comments: newComments
})
};
renderList = () => {
return this.state.comments.length === 0 ?
(<div className="no-comments">暂无评论,快去抢沙发吧!</div>) :
(
<ul>
{
this.state.comments.map(item => (
<li key={item.id}>
<h4>评论人: {item.name}</h4>
<p>评论内容:{item.content}</p>
</li>
))
}
</ul>
)
};
render() {
const {userName, userContent} = this.state;
return (
<div className="app">
<div>
<input type="text"
name="userName"
value={userName}
onChange={this.handleForm}
className="user"
placeholder="请输入评论人"/>
<br/>
<textarea name="userContent"
className="content"
value={userContent}
onChange={this.handleForm}
cols="30" rows="10"
placeholder="请输入评论内容">
</textarea>
<br/>
<button onClick={this.publishComments}>发表评论</button>
</div>
{/* 渲染评论列表 使用三元表达式 */}
{ this.renderList() }
</div>
)
}
}
// 导出
export default CommentsDemo;
使用ReactDOM.render( <CommentsDemo />, document.getElementByID('root))
渲染组件
【 React -- 2/100 】使用React实现评论功能的更多相关文章
- 【React 8/100】 React路由
React路由 React路由介绍 现代的前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序.因为它的用户体验更好.对服务器压力更小,所以更受欢迎.为了有效的使用单个页面来管 ...
- 【React 6/100】 React原理 | setState | JSX语法转换 | 组件更新机制
****关键字 | setState | JSX语法转换 | 组件更新机制 组件更新机制 setState() 的两个作用 修改state 更新组件 过程:父组件重新渲染时,也会重新渲染子组件,但只会 ...
- 【 React - 1/100 】React绑定事件this指向问题--改变state中的值
/** * 报错: * Cannot read property 'setState' of undefined * 原因: this指向不一致.btnAddCount中的this 和render中的 ...
- React.js 小书 Lesson25 - 实战分析:评论功能(四)
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson25 转载请注明出处,保留原文链接和作者信息. (本文未审核) 目前为止,第二阶段知识已经基本 ...
- React.js 小书 Lesson16 - 实战分析:评论功能(三)
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson16 转载请注明出处,保留原文链接和作者信息. 接下来的代码比较顺理成章了.修改 Commen ...
- React.js 小书 Lesson14 - 实战分析:评论功能(一)
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson14 转载请注明出处,保留原文链接和作者信息. 课程到这里大家已经掌握了 React.js 的 ...
- React+后端实现导出Excle表格的功能
最近在做一个基于React+antd前端框架的Excel导出功能,我主要在后端做了处理,根据以下步骤,可以很容易就实现导出Excel表格数据的功能. 在做这类导出文件的功能,其实,在后端进行处理,会更 ...
- React Editor 应用编辑器(1) - 拖拽功能剖析
这是可视化编辑器 Gaea-Editor 的第一篇连载分析文章,希望我能在有限的篇幅讲清楚制作这个网页编辑器的动机,以及可能带来的美好使用前景(画大饼).它会具有如下几个特征: 运行在网页 文档流布局 ...
- 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>
Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...
- React-Native(三):React Native是基于React设计的
React Native是基于React js设计的. 参考:<React 入门实例教程> React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript ...
随机推荐
- 利用 clipboardData 在网页中实现截屏粘贴的功能
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- intellij idea中去除@Autowired注入对象的红色波浪线提示
idea中通过@Autowired注入的对象一直有下划线提示. 解决:改变@Autowired的检查级别即可. 快捷键:Ctrl+Alt+s,进入idea设置界面,输入inspections检索
- iOS 自定义一对UI表现相反的按钮
假如有一对按钮[重置][提交],要让他们的默认UI和点击的UI表现刚好相反 [提交]按钮,默认橙色,点击边框是橙色,字体是橙色,背景变白色 [重置]按钮,默认白色橙色,边框是橙色,点击字体是白色,背景 ...
- 高级软件测试技术-任务进度和总结-Day04
任务进度11-16 使用工具 Jira 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了这几天的学习和小组成员的努力,虽然其中还准备了考试,但是大家还是最终按时完成了任务,今 ...
- ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)E Eve
E: 模拟题,一开始有n个人(有男有女),对于子女来说线粒体DNA是继承母亲的.然后有m个操作(按时间顺序),一种就是给了父亲,母亲的ID,生了一个孩子(编号从n+1开始往下):还有一个就是 -x , ...
- nodejs 文件操作
前言: nodejs 自带的文件操作的模块 fs 就是对文件的增删查改: 就像我们用的服务器,我们没有办法在运行的文件上进行一直的修改,因为他不向浏览器,刷新后我们的文件会自己修改: 如果想要更改我 ...
- Vue项目移动端滚动穿透问题
概述 今天在做 Vue 移动端项目的时候遇到了滚动穿透问题,在网上查资料后,选取了我觉得最好的方法,记录下来供以后开发时参考,相信对其他人也有用. 上层无需滚动 如果上层无需滚动的话,直接屏蔽上层的 ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_5 mybatis注解建立实体类属性和数据库表中列的对应关系
创建新项目,一对多 复制刚才关闭的项目的文件 复制到们的新项目里面 复制包的依赖 删减相关代码.只保留这三个查询的方法 模糊查询改成传统的占位符的方式 之前是可以自定义实体类的属性字段,和数据库的字典 ...
- C# 打印倒三角
void test6(int num) { try { #region 方法1 int maxstar = (num - 1) * 2 + 1; string line = ""; ...
- 【Java基础】内部类
非静态内部类不能拥有静态变量 为什么 下面这段代码,如果Lazyholder没有static修饰,则编译不过 class Singleton2 { private static class LazyH ...