React之留言

2017-08-03  本文已影响74人  土乒76
CommentApp
import React, { Component } from 'react'
import CommentInput from './CommentInput'
import CommentList from './CommentList'

class CommentApp extends Component {
    constructor() {
        super()
        this.state = {
            comments: []
        }
    }

    handleSubmitComment(comment) {
        if (!comment) return
        if (!comment.username) return alert('请输入用户名')
        if (!comment.content) return alert('请输入评论内容')
        this.state.comments.push(comment)
        this.setState({
            comments: this.state.comments
        })
    }

    render() {
        return (
            <div className='wrapper'>
                <CommentInput onSubmit={this.handleSubmitComment.bind(this)} />
                <CommentList comments={this.state.comments} />
            </div>
        )
    }
}

export default CommentApp
CommentInput
import React, { Component } from 'react'

class CommentInput extends Component {
    constructor() {
        super()
        this.state = {
            username: '',
            content: ''
        }
    }

    handleUsernameChange(event) {
        this.setState({
            username: event.target.value
        })
    }

    handleContentChange(event) {
        this.setState({
            content: event.target.value
        })
    }

    handleSubmit() {
        if (this.props.onSubmit) {
            this.props.onSubmit({
                username: this.state.username,
                content: this.state.content,
            })
        }
        this.setState({ content: '' })
    }

    render() {
        return (
            <div className='comment-input'>
                <div className='comment-field'>
                    <span className='comment-field-name'>用户名:</span>
                    <div className='comment-field-input'>
                        <input
                            value={this.state.username}
                            onChange={this.handleUsernameChange.bind(this)} />
                    </div>
                </div>
                <div className='comment-field'>
                    <span className='comment-field-name'>评论内容:</span>
                    <div className='comment-field-input'>
                        <textarea
                            value={this.state.content}
                            onChange={this.handleContentChange.bind(this)} />
                    </div>
                </div>
                <div className='comment-field-button'>
                    <button
                        onClick={this.handleSubmit.bind(this)}>
                        发布
                    </button>
                </div>
            </div>
        )
    }
}

export default CommentInput
CommentList
import React, { Component } from 'react'
import Comment from './Comment'

class CommentList extends Component {
    render() {
        return (
            <div>
                {this.props.comments.map((comment, i) =>
                    {/*注意这里key的位置*/}
                    <Comment comment={comment} key={i} />
                )}
            </div>
        )
    }
}
CommentList.defaultProps = {
    comments: []
}
export default CommentList
Comment
import React, { Component } from 'react'

class Comment extends Component {
    render() {
        return (
            <div className='comment'>
                <div className='comment-user'>
                    {/*这里不需要对props进行修改,那就直接使用*/}
                    <span>{this.props.comment.username} </span>:
                </div>
                <p>{this.props.comment.content}</p>
            </div>
        )
    }
}

export default Comment
index
import React from 'react';
import ReactDOM from 'react-dom';
import CommentApp from './modules/CommentApp';

ReactDOM.render(
    <CommentApp/>,
    document.getElementById("app")
)
style.css
body{margin:0;padding:0;font-family:sans-serif;background-color:#fbfbfb}.wrapper{width:500px;margin:10px auto;font-size:14px;background-color:#fff;border:1px solid #f1f1f1;padding:20px}.comment-input{background-color:#fff;border:1px solid #f1f1f1;padding:20px;margin-bottom:10px}.comment-field{margin-bottom:15px;display:flex}.comment-field .comment-field-name{display:flex;flex-basis:100px;font-size:14px}.comment-field .comment-field-input{display:flex;flex:1}.comment-field-input input,.comment-field-input textarea{border:1px solid #e6e6e6;border-radius:3px;padding:5px;outline:0;font-size:14px;resize:none;flex:1}.comment-field-input textarea{height:100px}.comment-field-button{display:flex;justify-content:flex-end}.comment-field-button button{padding:5px 10px;width:80px;border:none;border-radius:3px;background-color:#00a3cf;color:#fff;outline:0;cursor:pointer}.comment-field-button button:active{background:#13c1f1}.comment-list{background-color:#fff;border:1px solid #f1f1f1;padding:20px}.comment{display:flex;border-bottom:1px solid #f1f1f1;margin-bottom:10px;padding-bottom:10px;min-height:50px}.comment .comment-user{flex-shrink:0}.comment span{color:#00a3cf;font-style:italic}.comment p{margin:0}
上一篇 下一篇

猜你喜欢

热点阅读