一步一步写web之react实战(四-评论框)
来源:互联网 发布:php小炒花生米 编辑:程序博客网 时间:2024/04/29 10:27
昨天完成了初始化,顺便看了下源代码,今天预计写出一个示例评论框的,可惜最后卡在与服务端交互这里,是时候学习一波服务端知识了,知识这个节骨点有点不好合适,只能想着折中的办法吧,其实就差一个webapp没搞过了,好可惜,不然自己搞他一套完整的出来。争取react系列写完了学习后端,以后写分享就是前后通吃,哈哈!
还是开始吧,附上教程:http://reactjs.cn/react/docs/tutorial-zh-CN.html。因为教程下载的代码可以直接运行,我就没有用他的。在昨天的初始化项目里修改。教程里的代码都是ES5的语法,我有点不习惯,就只做参考,我这里就都转化成ES6了,大家想了解的话可以和教程作对比。
首先教程在body中引用script,在example.js里修改代码。而我们初始化的入口在App.js。我们就从这里入手。第一步先建一个CommentBox.js。在里面定义一个类
import React, {Component} from 'react';export default class CommentBox extends Component { render() { return ( <div className="commentBox"> <h1>我是CommentBox</h1> </div> ); }}然后在App.js里引用,引用也很简单,就是在头部用import导入,在render的return中把他当成普通的自闭合标签一样找个地方放一下就行。不会的去git上看代码吧,看一次就会。下面接着写,教程从“你的第一个组件”开始每个code头都加了
// tutorial1.js很多这种注释,只是数字在变。然而,这并不是我们需要建的文件名,不是说一个tuorial.js就是一个文件,写文章的都是大牛,这点小问题在他们看了就像吃饭需要筷子一样,不需要说的,也或者他们自己认为都在一个文件里,我只是用注释分区下方便你们阅读而已。我的代码呢就争取一个模块一个文件把它们区分开。
按照教程,我的代码最终分在这四个文件里。文章中都是React.creatClass创建类,而我用的是下面这种形式
import React, {Component} from 'react';import Comment from './Comment';export default class CommentList extends Component { render() { let commentNodes = this.props.data.map((comment)=>{ return ( <Comment author={comment.author} key={comment.id}> {comment.text} </Comment> ); }); return <div className="CommentList"> {commentNodes} </div>; }}这种创建类的方式默认就导出了,一个类一个文件,我觉得这样比较好。当然,定义变量我也尽量都用let而不是var。其实大家也可以把它们写在一个文件里,我也试了下可行,只是我还是喜欢分开,在一起的代码我注释了没有删
import React, {Component} from 'react';import Comment from './Comment';export default class CommentList extends Component { render() { let commentNodes = this.props.data.map((comment)=>{ return ( <Comment author={comment.author} key={comment.id}> {comment.text} </Comment> ); }); return <div className="CommentList"> {commentNodes} </div>; }}// class CommentForm extends Component{// constructor(props){// super(props);// }//// render(){// return <div className="commentForm">// Hello, world! I am a CommentForm.// </div>;// }// }//// class CommentBox extends Component{// constructor(props){// super(props);// this.state={// displayName: 'CommentBox',// }// }//// render(){// return (// React.createElement('div', {className: 'commentBox'},// "Hello, world! I am a CommentBox."// )// );// }// }// export {CommentList, CommentForm, CommentBox};这就是没分开的情况,把export default去掉,在最后统一export即可。
每个类一个文件的形式,这样对照教程就明朗了,教程中修改了什么我们就去对应的文件里改什么。还有一点,我的每个函数都进行了绑定,有两种方法
export default class Comment extends Component{ constructor(props){ super(props); this.rawMarkup=this.rawMarkup.bind(this); //这种绑定方式对应下面 11-15行 } rawMarkup() { let md = new Remarkable(); let rawMarkup = md.render(this.props.children.toString()); return { __html: rawMarkup}; } // //下面的箭头函数等同于第( 8 + 11-15 )行的效果 // rawMarkup = ()=>{ // let md = new Remarkable(); // let rawMarkup = md.render(this.props.children.toString()); // return { __html: rawMarkup}; // } render(){ // var md = new Remarkable(); return <div className="comment"> <h2 className="commentAuthor"> {this.props.author} </h2> <span dangerouslySetInnerHTML={this.rawMarkup()} /> </div> }}
上面这段代码用了两种绑定,第一个就是在构造函数constructor中用this绑定,第二种就是注释掉的那几行代码,用箭头函数绑定。两种绑定引用是相同的都是this.rawMarkup()。
最终代码卡在与服务器交互了,从服务端获取数据。我想自己研究下node.js自己写一个服务器的,可是最近时间很紧,以后得把这一块只是空白补上,不能留遗憾!还是附代码吧,这几天争取看下前后端分离的框架,不能像今天这样,遇到服务端就卡主了。附上今天的页面展示与代码。
https://github.com/dwenb/react-learning/commits/master
罪过!!!忘了这一篇代码忘了传了,虽然是不完整的,引以为戒,下不为例!
- 一步一步写web之react实战(四-评论框)
- 一步一步写web之react实战(一)
- 一步一步写web之react实战(二)
- 一步一步写web之react实战(三-新建项目与代码分析)
- 一步一步写web之初识web(四)
- 一步一步写web之初识web(一)
- 一步一步写web之初识web(二)
- 一步一步写web之初识web(三)
- 一步一步写web之初识web(六)
- React-Native 之 项目实战(四)
- React-Native 之 项目实战(四)
- 一步一步写算法(之)
- 一步一步写算法(之)
- 一步一步写算法(之)
- 一步一步写简易版飞鸽传书(四)
- 一步一步写web之初识web(五-简单源码分析篇)
- 一步一步写web之初识web(五-数据滚动实现)
- RabbitMQ学习之:(四)回头看刚才写的程序 (转贴+我的评论)
- Lucene系列
- hdu 1636 Invitation Cards //spfa 详解;
- 动态规划
- python读取txt文件时的中文乱码问题
- 牛客网——链表中的环的入口点
- 一步一步写web之react实战(四-评论框)
- 啤酒和饮料
- apt-get install无法安装任意包问题
- 在cell中实现跳转
- 特征选择与特征学习
- Masonry的简单使用和xib中如何使用AutoLayout
- 友元与运算符重载
- 第七周:(LeetCode 300) Longest Increasing Subsequence(c++)
- 玩转ubuntu 之 问题与技巧