1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. </head>
    9. <body>
    10. <div id="example"></div>
    11. //1. JSX 允许将 HTML 标签直接放入 JavaScript 代码中 前提是标注 <script type="text/babel">
    12. <script type="text/babel">
    13. ReactDOM.render(
    14. <h1>Hello, world!</h1>,
    15. document.getElementById('example')
    16. );
    17. </script>
    18. </body>
    19. </html>
    1. <div id="example"></div>
    2. <script type="text/babel">
    3. //2. 您也可以在 JSX 中使用 JavaScript。它以尖括号 (<) 作为 HTML 语法的开头,以大括号 ( {) 作为 JavaScript 语法的开头。
    4. var names = ['Alice', 'Emily', 'Kate','zqy'];
    5. ReactDOM.render(
    6. <div>
    7. {
    8. names.map(function (name, index) {
    9. return <div class={index} key={index}>Hello, {name}!</div>
    10. })
    11. }
    12. </div>,
    13. document.getElementById('example')
    14. );
    15. </script>
    1. <div id="example"></div>
    2. <script type="text/babel">
    3. //3. 如果 JavaScript 变量是数组,则 JSX 将隐式连接数组的所有成员。
    4. var arr = [
    5. <h1 key="1">Hello world!</h1>,
    6. <h2 key="2">React is awesome</h2>,
    7. ];
    8. ReactDOM.render(
    9. <div>{arr}</div>,
    10. document.getElementById('example')
    11. );
    12. </script>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. </head>
    9. <body>
    10. <div id="example"></div>
    11. <script type="text/babel">
    12. //4. class ComponentName extends React.Component 创建一个组件类,它实现了一个 render 方法来返回该类的一个组件实例。
    13. //请记住组件名称的第一个字母必须大写,否则 React 会抛出错误。例如,HelloMessage作为组件的名称是可以的,但helloMessage不允许。一个 React 组件应该只有一个顶级子节点。
    14. class HelloMessage extends React.Component {
    15. render() {
    16. return <h1>Hello {this.props.name}</h1>;
    17. }
    18. }
    19. ReactDOM.render(
    20. <HelloMessage name="John" />,
    21. document.getElementById('example')
    22. );
    23. </script>
    24. </body>
    25. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. </head>
    9. <body>
    10. <div id="example"></div>
    11. <script type="text/babel">
    12. //5. React 用于this.props.children访问组件的子节点。
    13. //class Note注意, 的值this.props.children具有三种可能性。如果组件没有子节点,则值为undefined; 如果单个子节点,一个对象;如果有多个子节点,则为一个数组。你应该小心处理它。
    14. //React 为我们提供React.Children了处理this.props.children不透明数据结构的实用程序。您可以使用React.Children.map来进行迭代,this.props.children而不必担心其数据类型是undefined或object。
    15. class NotesList extends React.Component {
    16. render() {
    17. return (
    18. <ol>
    19. {
    20. React.Children.map(this.props.children, function (child) {
    21. return <li>{child}</li>;
    22. })
    23. }
    24. </ol>
    25. );
    26. }
    27. }
    28. ReactDOM.render(
    29. <NotesList>
    30. <span>hello</span>
    31. <span>world</span>
    32. </NotesList>,
    33. document.getElementById('example')
    34. );
    35. </script>
    36. </body>
    37. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. <script src="../build/prop-types.js"></script>
    9. </head>
    10. <body>
    11. <div id="example"></div>
    12. <script type="text/babel">
    13. //6. PropTypes 组件参数验证
    14. //更多参数请参考
    15. //https://reactjs.org/docs/typechecking-with-proptypes.html
    16. var data = '123';
    17. class MyTitle extends React.Component {
    18. static propTypes = {
    19. title: PropTypes.string.isRequired,
    20. }
    21. render() {
    22. return <h1> {this.props.title} </h1>;
    23. }
    24. }
    25. ReactDOM.render(
    26. <MyTitle title={data}/>,
    27. document.getElementById('example')
    28. );
    29. </script>
    30. </body>
    31. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. </head>
    9. <body>
    10. <div id="example"></div>
    11. <!-- https://reactjs.org/docs/refs-and-the-dom.html#callback-refs -->
    12. <script type="text/babel">
    13. //7 . React.createRef() ??
    14. //有时您需要在组件中引用 DOM 节点。React 为您提供了ref将 DOM 节点附加到由React.createRef().
    15. class MyComponent extends React.Component {
    16. constructor(props) {
    17. super(props);
    18. this.myTextInput = React.createRef();
    19. this.handleClick = this.handleClick.bind(this)
    20. }
    21. handleClick() {
    22. console.log(1)
    23. this.myTextInput.current.focus();
    24. }
    25. render() {
    26. return (
    27. <div>
    28. <input type="text" ref={this.myTextInput} />
    29. <input type="button" value="Focus the text input" onClick={this.handleClick} />
    30. </div>
    31. );
    32. }
    33. }
    34. ReactDOM.render(
    35. <MyComponent />,
    36. document.getElementById('example')
    37. );
    38. </script>
    39. </body>
    40. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. </head>
    9. <body>
    10. <div id="example"></div>
    11. <script type="text/babel">
    12. //8. React 将组件视为状态机,并用于this.state保存组件的状态,this.setState()更新this.state和重新渲染组件。
    13. class LikeButton extends React.Component {
    14. constructor(props) {
    15. super(props)
    16. this.state = {
    17. liked: false
    18. }
    19. this.handleClick = this.handleClick.bind(this)
    20. }
    21. handleClick(event) {
    22. this.setState({ liked: !this.state.liked });
    23. }
    24. render() {
    25. var text = this.state.liked ? 'like' : 'haven\'t liked';
    26. return (
    27. <p onClick={this.handleClick}>
    28. You {text} this. Click to toggle.
    29. </p>
    30. );
    31. }
    32. }
    33. ReactDOM.render(
    34. <LikeButton />,
    35. document.getElementById('example')
    36. );
    37. </script>
    38. </body>
    39. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. </head>
    9. <body>
    10. <div id="example"></div>
    11. <script type="text/babel">
    12. //9. 双向绑定
    13. //根据 React 的设计理念,this.state描述组件的状态并通过用户交互进行变异,this.props描述组件的属性并且是稳定不可变的。
    14. 因此,valueForm 组件的属性,例如 <input>、<textarea> <option>,不受任何用户输入的影响。如果您想访问或更新值以响应用户输入,您可以使用 onChange 事件。
    15. class Input extends React.Component {
    16. constructor(props) {
    17. super(props)
    18. this.state = {
    19. value: 'Hello!'
    20. }
    21. this.handleChange = this.handleChange.bind(this)
    22. }
    23. handleChange(event) {
    24. this.setState({ value: event.target.value });
    25. }
    26. render() {
    27. var value = this.state.value;
    28. return (
    29. <div>
    30. <input type="text" value={value} onChange={this.handleChange} />
    31. <p>{value}</p>
    32. </div>
    33. );
    34. }
    35. }
    36. ReactDOM.render(<Input/>, document.getElementById('example'));
    37. </script>
    38. </body>
    39. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. </head>
    9. <body>
    10. <div id="example"></div>
    11. <script type="text/babel">
    12. //10. 组件的生命周期分为三个主要部分:Mounting(插入到 DOM 中)、Updating(重新渲染)和 Unmounting(从 DOM 中移除)。React 为这些生命周期部分提供了钩子。will方法在某事发生之前被调用,did方法在某事发生之后被立即调用。
    13. class Hello extends React.Component {
    14. constructor(props) {
    15. super(props)
    16. this.state = {
    17. opacity: 1.0
    18. };
    19. }
    20. //在初始渲染发生后触发一次
    21. componentDidMount() {
    22. this.timer = setInterval(function () {
    23. var opacity = this.state.opacity;
    24. opacity -= .05;
    25. if (opacity < 0.1) {
    26. opacity = 1.0;
    27. }
    28. this.setState({
    29. opacity: opacity
    30. });
    31. }.bind(this), 100);
    32. }
    33. render() {
    34. return (
    35. <div style={{opacity: this.state.opacity}}>
    36. Hello {this.props.name}
    37. </div>
    38. );
    39. }
    40. }
    41. ReactDOM.render(
    42. <Hello name="world"/>,
    43. document.getElementById('example')
    44. );
    45. </script>
    46. </body>
    47. </html>
    48. componentWillMount():在初始渲染发生之前触发一次。连接消息侦听器的好地方。this.setState在这里不起作用。
    49. componentDidMount():在初始渲染发生后触发一次。可以使用this.getDOMNode()。
    50. componentWillUpdate(object nextProps, object nextState):在组件对 DOM 进行更新后触发。可this.getDOMNode()用于更新。
    51. componentDidUpdate(object prevProps, object prevState):在组件的更新刷新到 DOM 后立即调用。初始渲染不会调用此方法。以此为契机,在组件更新后对 DOM 进行操作。
    52. componentWillUnmount():在从 DOM 卸载组件之前立即触发。删除消息侦听器或一般清理的好地方。
    53. componentWillReceiveProps(object nextProps):当组件接收新道具时触发。你可能想this.setState根据道具。
    54. shouldComponentUpdate(object nextProps, object nextState):当接收到新的道具或状态时,在渲染之前触发。return false如果您知道不需要更新。
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. <script src="../build/jquery.min.js"></script>
    9. </head>
    10. <body>
    11. <div id="example"></div>
    12. <script type="text/babel">
    13. //11.如何从服务器或 API 提供者获取组件的数据?答案是使用 Ajax 在componentDidMount. 当服务器响应到达时,存储数据this.setState()以触发 UI 的重新呈现。
    14. class UserGist extends React.Component {
    15. constructor(props) {
    16. super(props)
    17. this.state = {
    18. username: '',
    19. lastGistUrl: ''
    20. }
    21. }
    22. componentDidMount() {
    23. $.get(this.props.source, function(result) {
    24. console.log(result,"result");
    25. var lastGist = result[0];
    26. this.setState({
    27. username: lastGist.owner.login,
    28. lastGistUrl: lastGist.html_url
    29. });
    30. }.bind(this));
    31. }
    32. render() {
    33. return (
    34. <div>
    35. {this.state.username}'s last gist is <a href={this.state.lastGistUrl}>here</a>.
    36. </div>
    37. );
    38. }
    39. }
    40. ReactDOM.render(
    41. <UserGist source="https://api.github.com/users/octocat/gists" />,
    42. document.getElementById('example')
    43. );
    44. </script>
    45. </body>
    46. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <script src="../build/react.development.js"></script>
    6. <script src="../build/react-dom.development.js"></script>
    7. <script src="../build/babel.min.js"></script>
    8. <script src="../build/jquery.min.js"></script>
    9. </head>
    10. <body>
    11. <div id="example"></div>
    12. <script type="text/babel">
    13. //12. 异步请求
    14. class RepoList extends React.Component {
    15. constructor(props) {
    16. super(props)
    17. this.state = {
    18. loading: true,
    19. error: null,
    20. data: null
    21. };
    22. }
    23. componentDidMount() {
    24. this.props.promise.then(
    25. value => this.setState({loading: false, data: value}),
    26. error => this.setState({loading: false, error: error}));
    27. }
    28. render() {
    29. if (this.state.loading) {
    30. return <span>Loading...</span>;
    31. }
    32. else if (this.state.error !== null) {
    33. return <span>Error: {this.state.error.message}</span>;
    34. }
    35. else {
    36. var repos = this.state.data.items;
    37. var repoList = repos.map(function (repo, index) {
    38. return (
    39. <li key={index}><a href={repo.html_url}>{repo.name}</a> ({repo.stargazers_count} stars) <br/> {repo.description}</li>
    40. );
    41. });
    42. return (
    43. <main>
    44. <h1>Most Popular JavaScript Projects in Github</h1>
    45. <ol>{repoList}</ol>
    46. </main>
    47. );
    48. }
    49. }
    50. }
    51. ReactDOM.render(
    52. <RepoList promise={$.getJSON('https://api.github.com/search/repositories?q=javascript&sort=stars')} />,
    53. document.getElementById('example')
    54. );
    55. </script>
    56. </body>
    57. </html>