喽了一眼阮一峰老师的react文章,感觉写的挺棒,这篇只是按照自己思路屡一遍,纯属自学笔记,不承担社会暴乱责任。前几天,打算学vuejs,师兄给了一句话的点播,感觉很醍醐灌顶。总结下,所有这种能够实现数据双向绑定的JS框架,对于业务而言,最大的影响:实现了DOM的自动刷新。实现改了一个地方的数据,与之相关的DOM节点会自动变成对应的样子。不用我们 手动的 跟在 事件 后面 用冗余的JS操作DOM。
--------写在前面的话
react正文即将开始。。。。。。。
一:语法层面(有待补充)
1. class 改为className
2. for 改为 HTMLfor
3.<body style='color:this.state.color'>;改为 <body style={{color:this.state.color}}>
4. 所有react在html页面中写在<script type='text/label'></script>
5. 在react中所有HTML都是可以直接写的,js也是。JSX语法默认,碰到'<'执行html,碰到'{'执行JS语法。
6.event.target.value 读取输入框的值。
三:具体使用(代码农民工,搬砖急需的。。。)
就按照正常的完成页面的逻辑,列举一下每个行为用reactJS怎么实现。如何获取渲染页面的数据------拿到数据渲染DOM--------操作DOM。
代码是拷贝的,注释是强行添加,o(╯□╰)o
<html> <head> <script src="../build/react.js"></script> <script src="../build/react-dom.js"></script> <script src="../build/browser.min.js"></script> <script src="../build/jquery.min.js"></script> </head> <body> <script type="text/babel"> var UserGist = React.createClass({ getInitialState: function() { <!--设置默认数据--> return { username: '', lastGistUrl: '' }; }, componentDidMount: function() { $.get(this.props.source, function(result) {<!--请求数据,处理数据--> var lastGist = result[0]; if (this.isMounted()) { <!--将数据和DOM建立关系--> this.setState({ <!--lastGist是刚刚自定义的数据名,userName是DOM中的取数据的key,owner,html_url,login都是数据源中的字段--> username: lastGist.owner.login, lastGistUrl: lastGist.html_url }); } }.bind(this)); }, render: function() { return ( <div> <!--将setState 中数据取出 --> {this.state.username}'s last gist is <a href={this.state.lastGistUrl}>here</a>. </div> ); } }); ReactDOM.render( <UserGist source="https://api.github.com/users/octocat/gists" />, <!--source是请求数据接口的链接--> document.body ); <!--UserGist组件可以看成是一个渲染模板,数据源在实例化的时候提供--> </script> </body> </html>
二:关于react自定义组件相关(第2点我写了好多。。。好占地方就只能放最后了,氮素,看完这个才能看懂第二点。。。)
在这之前先贴两段阮一峰老师文章中的代码,展示下reactJS基本的语法和写法
1.下面这个是最基本的
<!DOCTYPE html> <html> <head>balabala</head> <body> <div id="example"></div> <script type="text/babel"> ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') ); </script> </body> </html>
2. 这个是业务一定会用的"组件"的写法规范
<html> <head>balabala</head> <body> <script type="text/babel"> var NotesList = React.createClass({ render: function() { return ( <ol> { React.Children.map(this.props.children, function (child) { return <li>{child}</li>; }) } </ol> ); } }); ReactDOM.render( <NotesList> <span>hello</span> <span>world</span> </NotesList>, document.body ); </script> </body> </html>
1.2.:综上:
(1):所有通过调用组件或者基本的react代码渲染页面的代码都写在:reactDOM.render();
(2):组件相关
1) 声明:var 组件名 = React.createClass({}),调用自定义组件<组件名 ></组件名>
2) 自定义组件中一定要有的方法render()
3)PropTypes,
a:PropTypes,组件类的属性,这个里面的内容,用于验证实例的属性是否符合要求。可以定义属性的类型(number,string..),属性是否必须(isRequired)等
b: 关于定义和使用。
var MyTitle = React.createClass({ propTypes: { title: React.PropTypes.string.isRequired, }, render: function() { return <h1> {this.props.title} </h1>; } });
c: PropTypes使用详细说明
React.createClass({
propTypes: {
// You can declare that a prop is a specific JS primitive. By default, these
// are all optional.
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
// Anything that can be rendered: numbers, strings, elements or an array
// (or fragment) containing these types.
optionalNode: React.PropTypes.node,
// A React element.
optionalElement: React.PropTypes.element,
// You can also declare that a prop is an instance of a class. This uses
// JS's instanceof operator.
optionalMessage: React.PropTypes.instanceOf(Message),
// You can ensure that your prop is limited to specific values by treating
// it as an enum.
optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
// An object that could be one of many types
optionalUnion: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.number,
React.PropTypes.instanceOf(Message)
]),
// An array of a certain type
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
// An object with property values of a certain type
optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
// An object taking on a particular shape
optionalObjectWithShape: React.PropTypes.shape({
color: React.PropTypes.string,
fontSize: React.PropTypes.number
}),
// You can chain any of the above with `isRequired` to make sure a warning
// is shown if the prop isn't provided.
requiredFunc: React.PropTypes.func.isRequired,
// A value of any data type
requiredAny: React.PropTypes.any.isRequired,
// You can also specify a custom validator. It should return an Error
// object if the validation fails. Don't `console.warn` or throw, as this
// won't work inside `oneOfType`.
customProp: function(props, propName, componentName) {
if (!/matchme/.test(props[propName])) {
return new Error('Validation failed!');
}
}
},
/* ... */
});
d: getDefaultProps 方法可以用来设置组件属性的默认值。
4):如何调用自定义组件中方法
handleChange: function(event) { this.setState({value: event.target.value}); },
render: function () { var value = this.state.value; return ( <div> <input type="text" value={value} onChange={this.handleChange} /> <p>{value}</p> </div> ); }
另外:支持的事件和属性等 官方提供列表文档
5):如何获取真实节点
在没添加到DOM之前,所有节点都是虚拟的,获取真实节点,添加ref属性
var MyComponent = React.createClass({ handleClick: function() { this.refs.myTextInput.focus(); }, render: function() { return ( <div> <input type="text" ref="myTextInput" /> <input type="button" value="Focus the text input" onClick={this.handleClick} /> </div> ); } }); ReactDOM.render( <MyComponent />, document.getElementById('example') );