[关闭]
@rg070836rg 2018-03-11T16:54:14.000000Z 字数 4531 阅读 941

React

react


#

whats

创建可复用的web组件
只提供mvc中的v层

why

组件化,无需 模板
比较容易理解(js逻辑和html紧密连接,可以在js中写html,无需以字符串或者url)
单项数据流:数据一旦更新,重新直接渲染整个app!

react渲染方式(单项数据流):

用户输入-->从api获得数据-->传输数据给顶层组件-->react渲染组件(依次下传)

虚拟dom树

重建dom树
查找差异
计算需要更新的部分
批量更新

JSX

基于js的XML语法扩展??

实践

官方主页:
https://reactjs.org

安装node.js (win环境)
https://nodejs.org/en

可参考
http://blog.csdn.net/xxmeng2012/article/details/51492149
http://www.runoob.com/nodejs/nodejs-http-server.html

本次实践,不追求详解。

安装完之后,通过cmd,查看安装状态
node -v
npm -v
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题

  1. C:\Users\chen>node -v
  2. v8.10.0
  3. C:\Users\chen>npm -v
  4. 5.6.0

开发环境,webstorm+chrome

由于npm的国外速度很慢,切换成淘宝的

  1. $ npm install -g cnpm --registry=https://registry.npm.taobao.org
  2. $ npm config set registry https://registry.npm.taobao.org

以后 使用
cnpm install [name]
支持主页:http://npm.taobao.org/

快速构建react环境

  1. cnpm install -g create-react-app
  2. cd C:\Users\chen\WebstormProjects\first
  3. create-react-app my-app
  4. cd my-app/
  5. npm start

尝试修改 app.js,效果如下

image.png-19.4kB

React JSX:React 使用 JSX 来替代常规的 JavaScript。

WHY JSX:

1.执行更快
2.编译可以发现错误
3.编写模板更快

简单学习:(缺少html的知识~)

推荐使用 内联样式表:

  1. import React, { Component } from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. //内联样式表
  5. var myStyle = {
  6. fontSize: 100,
  7. color: '#FF0000'
  8. };
  9. class App extends Component {
  10. render() {
  11. return (
  12. <h1 style = {myStyle}>HELLO</h1>
  13. );
  14. }
  15. }
  16. export default App;

内嵌数组:数组会自动展开所有成员,也可以指定使用

  1. import React, { Component } from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. var arr = [
  5. <h1>11111</h1>,
  6. <h2>22222</h2>,
  7. ];
  8. class App extends Component {
  9. render() {
  10. return (
  11. <div>{arr}</div>
  12. );
  13. }
  14. }
  15. export default App;

React,可以渲染 HTML标签或 React组件
区别就在于,变量名大小写,例子如下
var myDivElement = ;
var MyComponent = React.createClass({/.../});

ps 注意:嵌套多个 HTML 标签,需要使用一个标签元素包裹它

  1. render() {
  2. return (
  3. <section>
  4. <h1>这是正确的例子</h1>
  5. <span>假设这里是标题下面的内容</span>
  6. </section>
  7. );
  8. }
  9. render() {
  10. return (
  11. <h1>这是错误的例子</h1>,
  12. <span>假设这里是标题下面的内容</span>
  13. );
  14. }

!!编写react 组件 新版 及其调用:不推荐 require

  1. import React, { Component } from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. //!!!!!!
  5. class HelloMessage extends Component {
  6. render(){
  7. return <h1>Hello World!</h1>;
  8. }
  9. }
  10. class App extends Component {
  11. render() {
  12. return (
  13. <HelloMessage/>//!!!!!!!!!
  14. );
  15. }
  16. }
  17. export default App;

A EXAMPLE

  1. import React, {Component} from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. class Timer extends Component {
  5. //构造器
  6. constructor(props) {
  7. super(props);
  8. this.state = {seconds: 0};
  9. }
  10. tick() {
  11. this.setState(prevState => ({
  12. seconds: prevState.seconds + 1
  13. }));
  14. }
  15. //组件加载时,触发的事件
  16. componentDidMount() {
  17. this.interval = setInterval(() => this.tick(), 1000);
  18. }
  19. //事件:组件注销,清除定时器
  20. componentWillUnmount() {
  21. clearInterval(this.interval);
  22. }
  23. render() {
  24. return (
  25. <div>
  26. Seconds: {this.state.seconds}
  27. </div>
  28. );
  29. }
  30. }
  31. class App extends Component {
  32. render() {
  33. return (
  34. <Timer/>
  35. );
  36. }
  37. }
  38. export default App;

外部参数模式:

  1. import React, {Component} from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. class HelloMessage extends Component {
  5. render() {
  6. return <h1>Hello {this.props.name}</h1>;
  7. }
  8. }
  9. class App extends Component {
  10. render() {
  11. return (
  12. <HelloMessage name="Runoob"/>
  13. );
  14. }
  15. }
  16. export default App;

复合组件

  1. import React, {Component} from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. class WebSite extends Component {
  5. render() {
  6. return (
  7. <div>
  8. <Name name={this.props.name}/>
  9. <Link site={this.props.site}/>
  10. </div>);
  11. }
  12. }
  13. class Name extends Component {
  14. render() {
  15. return (
  16. <h1>{this.props.name}</h1>
  17. );
  18. }
  19. }
  20. class Link extends Component {
  21. render() {
  22. return (
  23. <a href={this.props.site}>
  24. {this.props.site}
  25. </a>
  26. );
  27. }
  28. }
  29. class App extends Component {
  30. render() {
  31. return (
  32. <WebSite name="少儿编程" site=" http://www.helloworldroom.com"/>
  33. );
  34. }
  35. }
  36. export default App;

React State(状态)
React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。
React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。

  1. import React, {Component} from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. class LikeButton extends Component {
  5. //构造器
  6. constructor(props) {
  7. super(props);
  8. this.state = {liked: false};
  9. // !!!!这个绑定是必要的,要不然该事件中的this就会是当前实例!!!!!!
  10. this.handleClick = this.handleClick.bind(this);
  11. }
  12. handleClick (){
  13. console.log(111)
  14. this.setState(prevState => ({
  15. liked: !prevState.liked
  16. }));
  17. }
  18. //或者使用箭头函数
  19. // handleClick= () =>{
  20. // console.log(111)
  21. // this.setState(prevState => ({
  22. // liked: !prevState.liked
  23. // }));
  24. // }
  25. render() {
  26. var text = this.state.liked ? '喜欢' : '不喜欢';
  27. return (
  28. <p onClick={this.handleClick}>
  29. 你<b>{text}</b>我。点我切换状态。
  30. </p>
  31. );
  32. }
  33. }
  34. class App extends Component {
  35. render() {
  36. return (
  37. <LikeButton />
  38. );
  39. }
  40. }
  41. export default App;

State 和 Props 混用

  1. import React, {Component} from 'react';
  2. // import logo from './logo.svg';
  3. import './App.css';
  4. class WebSite extends Component {
  5. constructor(props) {
  6. super(props);
  7. this.state = {
  8. name: "菜鸟教程",
  9. site: "http://www.runoob.com"
  10. };
  11. }
  12. render() {
  13. return (
  14. <div>
  15. <Name name={this.state.name} />
  16. <Link site={this.state.site} />
  17. </div>
  18. );
  19. }
  20. }
  21. class Name extends Component {
  22. render() {
  23. return (
  24. <h1>{this.props.name}</h1>
  25. );
  26. }
  27. }
  28. class Link extends Component {
  29. render() {
  30. return (
  31. <a href={this.props.site}>
  32. {this.props.site}
  33. </a>
  34. );
  35. }
  36. }
  37. class App extends Component {
  38. render() {
  39. return (
  40. <WebSite />
  41. );
  42. }
  43. }
  44. export default App;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注