React_antd_Comment(评论)_typescript_antd+comment没有了-程序员宅基地

技术标签: antd  react  typescript  

嵌套评论

actions:在评论项项展示操作项列表;
author:显示为作者的名字;
avatar:显示评论头像元素,常为antdAvatar或者src;
children:嵌套子项;
content:评论内容;
datetime:显示时间;

  • index.tsx
import React, {
     Component } from 'react';
import {
     Comment, Avatar } from 'antd';

interface ICode {
    
  children?: any
  onClickComment: any
}

const ExampleComment: React.FC<ICode> = (code) => {
    
  const {
     children, onClickComment } = code;

  return (
    <Comment
      actions={
    [<span key="comment-nested-reply-to" onClick={
    onClickComment}>Reply to</span>]}
      author={
    <a>Han Solo</a>}
      avatar={
    
        <Avatar
          src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"
          alt="Han Solo"
        />
      }
      content={
    
        <p>
          We supply a series of design principles, practical patterns and high quality design
          resources (Sketch and Axure).
        </p>
      }
    >
      {
    children}
    </Comment>
  );
}

export class Index extends Component {
    
  render() {
    
    return (
      <div>
        <ExampleComment onClickComment = {
     this.exampleCommentClickedHandler }>
          <ExampleComment  onClickComment = {
     this.exampleCommentClickedHandler }>
          </ExampleComment>
        </ExampleComment>,
      </div>
    )
  }
  exampleCommentClickedHandler = () => {
    
    console.log("**********")
  }
}

export default Index;

在这里插入图片描述

  • 回复框
import React, {
     Component } from 'react';
import {
     Comment, Avatar, Form, Button, List, Input } from 'antd';
import moment from 'moment';

const {
     TextArea } = Input;

/**
 * 评论: 回复框
 */

interface ICode {
    
  submitting?: boolean,
  value?: string
}

interface IState extends ICode {
    
  comments: [],
}

interface IEditor extends ICode {
    
  onChangeComment: any,
  onClickComment: any,
}
/** 表单 */
const Editor: React.FC<IEditor> = (props) => {
    
  const {
     onChangeComment, onClickComment, value, submitting } = props;
  return (
    <>
      <Form.Item>
        <TextArea rows={
    4} onChange={
    onChangeComment} value={
    value} />
      </Form.Item>
      <Form.Item>
        <Button htmlType="submit" loading={
    submitting} onClick={
    onClickComment} type="primary"> Add Comment </Button>
      </Form.Item>
    </>
  );
}

/** 列表 */
const CommentList: React.FC<IState> = (state) => {
    
  const {
     comments } = state;
  return (
    <List
      dataSource={
    comments}
      header={
    `${
     comments.length} ${
     comments.length > 1 ? 'replies' : 'reply'}`}
      itemLayout="horizontal"
      renderItem={
    props => <Comment {
    ...props} />}
    />
  );
}

class Index extends Component<IState> {
    
  state: IState = {
    
    comments: [],
    submitting: false,
    value: '',
  }
  render() {
    
    const {
     comments, submitting, value } = this.state;
    return (

      <>
        {
    
          comments.length > 0 && <CommentList comments={
    comments} />
        }
        <Comment
          avatar={
    
            <Avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png"/>
          }
          content={
    
            <Editor
              onChangeComment={
    this.editorCommentChangedHandler}
              onClickComment={
    this.editorCommentClickedHandler}
              submitting={
    submitting}
              value={
    value} />
          }
        />
      </>
    )
  }

  editorCommentChangedHandler = (e: any) => {
    
    this.setState({
    
      value: e.target.value,
    });
  };

  editorCommentClickedHandler = () => {
    
    if (!this.state.value) {
    
      return;
    }

    this.setState({
    
      submitting: true,
    });
    /** 定时器 */
    setTimeout(() => {
    
      this.setState({
    
        submitting: false,
        value: '',
        comments: [
          {
    
            author: 'Tao Solo',
            avatar: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
            content: <p>{
    this.state.value}</p>,
            datetime: moment().fromNow(),
          },
          ...this.state.comments,//组合
        ],
      });
    }, 1000);
  }

}

export default Index;

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaomomi/article/details/107018626

智能推荐

win10安装linux子系统CentOS_windows sub linux centos-程序员宅基地

文章浏览阅读2.1k次。win10安装linux子系统CentOS(windows subsystem linux)流程记录参考文章win10系统设置子系统安装安装方式的选择流程下载安装启用补充参考文章https://www.jianshu.com/p/9a6095ea4363https://amito.me/2018/Install-CentOS-7-on-Windows-Subsystem-for-Linux/win10系统设置在Windows 中启用 WSL 功能.程序和功能->启用或关闭windows功能_windows sub linux centos

UVALive - 3938 "Ray, Pass me the dishes!" (线段树)-程序员宅基地

文章浏览阅读431次。原题链接Problem DescriptionAfter doing Ray a great favor to collect sticks for Ray, Poor Neal becomes very hungry. In return for Neal’s help, Ray makes a great dinner for Neal. When it is time for dinner,_ray, pass me the dishes!

刚在网上发现的在Linux下利用开源工具开发嵌入式系统的文章_嵌入式linux如何使用开源软件-程序员宅基地

文章浏览阅读2.3k次。版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://etdata.blogbus.com/logs/2192069.html载自Google Group1:嵌入式系统调试 总体上说嵌入式系统,特别是基于SOC设计的ARM,利用自由和开源软件作为嵌入式开发工具的一个完整部分在过去的几年内有很大的发展。一项由 linuxdevices.com进行的调查表明43%的_嵌入式linux如何使用开源软件

AJAX封装_ajax封装 csdn-程序员宅基地

文章浏览阅读204次。AJAX封装新建函数ajax,传参url、客户端获取成功后执行的函数、获取失败执行的函数。按照里面步骤,依次传参封装①创建ajax对象XHR②创建新的HTTP请求③发送请求④接收服务器数据AJAX封装调用调用ajax函数(参数:url、成功函数、失败函数)..._ajax封装 csdn

c++初学者应该了解的关于继承和构造的一些的常识_void cry-程序员宅基地

文章浏览阅读499次。1,c++是可以多继承的语言,也就是一个子类可以有几个父类,你问我c++没接口吗,答案是有。2关于继承方面的一些常识:#include <iostream>using namespace std;class father {public: int a; string c;public: void cry() { cout << "哇哇哇1" << endl;} void cry1() { co_void cry

看懂这27道面试!题 阿里正在向你招手!_软件专注于单一功能开发的优势-程序员宅基地

文章浏览阅读65次。根据 Gartner 的说法,微服务是云开发的新应用平台。微服务是独立部署和管理的,一旦应用实现在容器内,它们与底层操作系统的交互很少。因此,如果你希望把微服务添加到自己的技术栈中,并想要了解与之相关的技能,那么现在正是潜心研究的时候。在本文中,我收集了面试官最常问到的问题。微服务面试题与答案说说微服务架构的优势独立开发:所有微服务都可以根据各自的功能轻松开发独立部署:根据他们所提供的服务,可以在任何应用中单独部署故障隔离:即使应用中的一个服务不起作用,系统仍..._软件专注于单一功能开发的优势

随便推点

QT c++ 中使用PostMessage/SendMessage_qt sendmessage-程序员宅基地

文章浏览阅读2.6w次,点赞3次,收藏39次。 PostMessage是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中。并且不会等待响应的线程处理消息,而是直接返回。(简单的理解就是异步)。而SendMessage作用一样,但是会等待结果返回(同步)我们先来看PostMessage函数的原型:BOOL WINAPI PostMessage(HWND hWnd, UINT Msg, W..._qt sendmessage

初始对准及组合导航技术_双位置对准-程序员宅基地

文章浏览阅读9.5k次,点赞22次,收藏129次。一、对准是确定坐标系的过程1、初始对准比如说:初始对准就是确定的过程,通过重力加速度和地球自转角速度,其中,天向通过重力加速度确定,水平面的东北向通过地球自转角速度的分量确定。2、坐标系对准比如说,地面车辆中,IMU任意放置,如何确定;可以看出,对准就是确定坐标系的过程。3、矢量定姿<1>双矢量定姿矢量和不共线,因此,、和不共面,其三个矢量构成的矩阵可逆。由于上述矢量构建的姿态矩阵未必满足正交化要求,因此,预先对解算的矢量进行正交及单位化处理。即上述._双位置对准

QT——手动编译qt源代码过程_qt怎么编译-程序员宅基地

文章浏览阅读3.5k次。1.生成解决方案终端进入需要手动编译的项目所在的目录在该目录下执行qmake -project命令,注意qmake前面的路径是qmake的安装路径:/Qt5.11.3/5.11.3/gcc_64/bin/qmake -project该文件夹下会生成.pro文件注意:需要在该文件中添加项目执行过程中需要的模块,笔者的文件中添加了 QT += widgets2.生成Makefile文件..._qt怎么编译

VUE——MVVM框架理解_vue框架是mvvm-程序员宅基地

文章浏览阅读315次。MVVM工作原理MVVM框架理解MVVM的实现原理响应式:模板解析:如何将模板渲染为html小白一枚,正好最近Vue越来越火热,Github上的Star数已经超过了React。而其背后蕴含的MVVM框架思想也一直跟React的组件化开发思想并驾齐驱,在这里也是本着兼收并蓄的思想,多了解一种开发模式。因此通过一些学习资料,写一些自己对MVVM开发思想的理解。废话不多说,咱们进入正题。MVVM框..._vue框架是mvvm

内存修改器对游戏的危害_内存挂容易被检测吗-程序员宅基地

文章浏览阅读3.9k次,点赞4次,收藏10次。内存修改器是游戏外挂里面的一个大类,通过修改器可实现很多魔幻且具有很大破坏性的功能。 下面几张图是使用修改器实现的游戏破解效果。 内存修改器实现的透视功能 ..._内存挂容易被检测吗

如何在colab上使用mmdetection训练自己的数据集_colab使用mmdetedection-程序员宅基地

文章浏览阅读2.6k次,点赞8次,收藏28次。如何在colab上使用mmdetection训练自己的数据集这次受新冠肺炎疫情的影响,开学延期,但是导师要求在mmdetection平台上训练一个特殊的数据集,由于不在实验室缺乏相关的机器设备支撑实验(我自己只有一台gtx860的笔记本)所以考虑使用google免费的colab进行实验,之前没有使用过colab,所以记录一下全部过程。一、Colab的使用1. 访问google首先,使用谷歌..._colab使用mmdetedection

推荐文章

热门文章

相关标签