zoukankan      html  css  js  c++  java
  • React入门

    React Developer Tools.crx下载地址:https://pan.baidu.com/s/137XB-alpKdUS9k-5bHekrg

    React是一个声明式的,高效的,并且灵活的用于构建用户界面的 JavaScript 库。当数据更改时,React 将有效地更新并渲染正确的组件。组件接收参数,称为 props(属性),并通过 render 方法返回一个显示的视图层次结构。render 方法返回您要渲染的内容描述,然后 React 接受该描述并将其渲染到屏幕上。特别是,render 返回一个 React 元素,这是一个渲染内容的轻量级描述。大多数 React 开发人员使用一种名为 JSX 的特殊语法,可以更容易地编写这些结构。每个组件都是封装的,因此它可以独立操作,这允许你从简单的组件构建复杂的UI。

    jquery的瓶颈:

    1) 一个js文件有千把行是很正常的

    2) 各种ajax的callback毫无规则的在源文件里面到处乱飞

    3) html代码和dom操作也是随性所欲



    1.hello world

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script type="text/babel">
          function formatName(user) {
            return user.firstName + ' ' + user.lastName;
          }
    
          const user = {
            firstName: 'xu',
            lastName: 'tongbao'
          };
    
          const element = (
            <h1>
              Hello, {formatName(user)}!
            </h1>
          );
    
          ReactDOM.render(
            element,
            document.getElementById('root')
          );
        </script>
      </body>
    </html>


    2.时钟

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script type="text/babel">
          function tick() {
            const element = (
              <div>
                <h1>Hello, world!</h1>
                <h2>It is {new Date().toLocaleTimeString()}.</h2>
              </div>
            );
            ReactDOM.render(
              element,
              document.getElementById('root')
            );
          }
    
          setInterval(tick, 1000);
        </script>
      </body>
    </html>

    3.组件和属性

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script type="text/babel">
          function Welcome(props) {
            return <h1>Hello, {props.name}</h1>;
          }
    
          const element = <Welcome name="xutongbao" />;
          ReactDOM.render(
            element,
            document.getElementById('root')
          );
        </script>
      </body>
    </html>

    4.组件引用组件

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script type="text/babel">
          function Welcome(props) {
            return <h1>Hello, {props.name}</h1>;
          }
    
          function App() {
            return (
              <div>
                <Welcome name="xutongbao" />
                <Welcome name="徐同保" />
                <Welcome name="星河" />
              </div>
            );
          }
    
          ReactDOM.render(
            <App />,
            document.getElementById('root')
          );
        </script>
      </body>
    </html>

    5.提取组件

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script type="text/babel">
          function formatDate(date) {
            return date.toLocaleDateString();
          }
    
          function Avatar(props) {
            return (
              <img className="Avatar"
                   src={props.user.avatarUrl}
                   alt={props.user.name} />
            );
          }
    
          function UserInfo(props) {
            return (
              <div className="UserInfo">
                <Avatar user={props.user} />
                <div className="UserInfo-name">
                  {props.user.name}
                </div>
              </div>
            );
          }
    
          function Comment(props) {
            return (
              <div className="Comment">
                <UserInfo user={props.author} />
                <div className="Comment-text">
                  {props.text}
                </div>
                <div className="Comment-date">
                  {formatDate(props.date)}
                </div>
              </div>
            );
          }
    
          const comment = {
            date: new Date(),
            text: '希望你能快乐的学习react!',
            author: {
              name: '徐同保',
              avatarUrl: 'http://placekitten.com/g/64/64'
            }
          };
          ReactDOM.render(
            <Comment
              date={comment.date}
              text={comment.text}
              author={comment.author} />,
            document.getElementById('root')
          );
        </script>
      </body>
    </html>

    6.使用状态(state)和生命周期做的时钟

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script type="text/babel">
          class Clock extends React.Component {
            constructor(props) {
              super(props);
              this.state = {date: new Date()};
            }
    
            componentDidMount() {
              this.timerID = setInterval(
                () => this.tick(),
                1000
              );
            }
    
            componentWillUnmount() {
              clearInterval(this.timerID);
            }
    
            tick() {
              this.setState({
                date: new Date()
              });
            }
    
            render() {
              return (
                <div>
                  <h1>Hello, world!</h1>
                  <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
                </div>
              );
            }
          }
    
          ReactDOM.render(
            <Clock />,
            document.getElementById('root')
          );
        </script>
      </body>
    </html>

    7.事件(开关按钮)

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Hello World</title>
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
      </head>
      <body>
        <div id="root"></div>
        <script type="text/babel">
          class Toggle extends React.Component {
            constructor(props) {
              super(props);
              this.state = {isToggleOn: true};
    
              // 这个绑定是必要的,使`this`在回调中起作用
              this.handleClick = this.handleClick.bind(this);
            }
    
            handleClick() {
              this.setState(prevState => ({
                isToggleOn: !prevState.isToggleOn
              }));
            }
    
            render() {
              return (
                <button onClick={this.handleClick}>
                  {this.state.isToggleOn ? 'ON' : 'OFF'}
                </button>
              );
            }
          }
    
          ReactDOM.render(
            <Toggle />,
            document.getElementById('root')
          );
        </script>
      </body>
    </html>

    8.条件渲染(登录和退出)

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>
    <body>
    <div id="root"></div>
    <script type="text/babel">
    class LoginControl extends React.Component {
      constructor(props) {
        super(props);
        this.handleLoginClick = this.handleLoginClick.bind(this);
        this.handleLogoutClick = this.handleLogoutClick.bind(this);
        this.state = {isLoggedIn: false};
      }
    
      handleLoginClick() {
        this.setState({isLoggedIn: true});
      }
    
      handleLogoutClick() {
        this.setState({isLoggedIn: false});
      }
    
      render() {
        const isLoggedIn = this.state.isLoggedIn;
        
        let button = null;
        if (isLoggedIn) {
          button = <LogoutButton onClick={this.handleLogoutClick} />;
        } else {
          button = <LoginButton onClick={this.handleLoginClick} />;
        }
    
        return (
          <div>
            <Greeting isLoggedIn={isLoggedIn} />
            {button}
          </div>
        );
      }
    }
    
    function UserGreeting(props) {
      return <h1>Welcome back!</h1>;
    }
    
    function GuestGreeting(props) {
      return <h1>Please sign up.</h1>;
    }
    
    function Greeting(props) {
      const isLoggedIn = props.isLoggedIn;
      if (isLoggedIn) {
        return <UserGreeting />;
      }
      return <GuestGreeting />;
    }
    
    function LoginButton(props) {
      return (
        <button onClick={props.onClick}>
          Login
        </button>
      );
    }
    
    function LogoutButton(props) {
      return (
        <button onClick={props.onClick}>
          Logout
        </button>
      );
    }
    
    ReactDOM.render(
      <LoginControl />,
      document.getElementById('root')
    );
    </script>
    </body>
    </html>
    9.键(Keys)
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>
    <body>
    <div id="root"></div>
    <script type="text/babel">
    function Blog(props) {
      const sidebar = (
        <ul>
          {props.posts.map((post) =>
            <li key={post.id}>
              {post.title}
            </li>
          )}
        </ul>
      );
      const content = props.posts.map((post) =>
        <div key={post.id}>
          <h3>{post.title}</h3>
          <p>{post.content}</p>
        </div>
      );
      return (
        <div>
          {sidebar}
          <hr />
          {content}
        </div>
      );
    }
    
    const posts = [
      {id: 1, title: 'name', content: 'xutongbao'},
      {id: 2, title: '姓名', content: '徐同保'}
    ];
    ReactDOM.render(
      <Blog posts={posts} />,
      document.getElementById('root')
    );
    </script>
    </body>
    </html>
    10.表单(受控元素)
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>
    <body>
    <div id="root"></div>
    <script type="text/babel">
    class NameForm extends React.Component {
      constructor(props) {
        super(props);
        this.state = {value: ''};
    
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }
    
      handleChange(event) {
        this.setState({value: event.target.value});
      }
    
      handleSubmit(event) {
        alert('A name was submitted: ' + this.state.value);
        event.preventDefault();
      }
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name:
              <input type="text" value={this.state.value} onChange={this.handleChange} />
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }
    
    ReactDOM.render(
      <NameForm />,
      document.getElementById('root')
    );
    </script>
    </body>
    </html>
    11.表单(文件上传)
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>
    <body>
    <div id="root"></div>
    <script type="text/babel">
    class FileInput extends React.Component {
      constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(
          this
        );
      }
      handleSubmit(event) {
        event.preventDefault();
        alert(
          `Selected file - ${
            this.fileInput.files[0].name
          }`
        );
      }
    
      render() {
        return (
          <form
            onSubmit={this.handleSubmit}>
            <label>
              Upload file:
              <input
                type="file"
                ref={input => {
                  this.fileInput = input;
                }}
              />
            </label>
            <br />
            <button type="submit">
              Submit
            </button>
          </form>
        );
      }
    }
    
    ReactDOM.render(
      <FileInput />,
      document.getElementById('root')
    );
    </script>
    </body>
    </html>

    12.状态提升(将公用的值以及修改该值的方法都放在父组件里)

    在一个 React 应用中,对于任何可变的数据都应该循序“单一数据源”原则。通常情况下,state 首先被添加到需要它进行渲染的组件。然后,如果其它的组件也需要它,你可以提升状态到它们最近的祖先组件。你应该依赖 从上到下的数据流向 ,而不是试图在不同的组件中同步状态。

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    </head>
    <body>
    <div id="root"></div>
    <script type="text/babel">
    const scaleNames = {
      c: 'Celsius',
      f: 'Fahrenheit'
    };
    
    function toCelsius(fahrenheit) {
      return (fahrenheit - 32) * 5 / 9;
    }
    
    function toFahrenheit(celsius) {
      return (celsius * 9 / 5) + 32;
    }
    
    function tryConvert(temperature, convert) {
      const input = parseFloat(temperature);
      if (Number.isNaN(input)) {
        return '';
      }
      const output = convert(input);
      const rounded = Math.round(output * 1000) / 1000;
      return rounded.toString();
    }
    
    function BoilingVerdict(props) {
      if (props.celsius >= 100) {
        return <p>The water would boil.</p>;
      }
      return <p>The water would not boil.</p>;
    }
    
    class TemperatureInput extends React.Component {
      constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
      }
    
      handleChange(e) {
        this.props.onTemperatureChange(e.target.value);
      }
    
      render() {
        const temperature = this.props.temperature;
        const scale = this.props.scale;
        return (
          <fieldset>
            <legend>Enter temperature in {scaleNames[scale]}:</legend>
            <input value={temperature}
                   onChange={this.handleChange} />
          </fieldset>
        );
      }
    }
    
    class Calculator extends React.Component {
      constructor(props) {
        super(props);
        this.handleCelsiusChange = this.handleCelsiusChange.bind(this);
        this.handleFahrenheitChange = this.handleFahrenheitChange.bind(this);
        this.state = {temperature: '', scale: 'c'};
      }
    
      handleCelsiusChange(temperature) {
        this.setState({scale: 'c', temperature});
      }
    
      handleFahrenheitChange(temperature) {
        this.setState({scale: 'f', temperature});
      }
    
      render() {
        const scale = this.state.scale;
        const temperature = this.state.temperature;
        const celsius = scale === 'f' ? tryConvert(temperature, toCelsius) : temperature;
        const fahrenheit = scale === 'c' ? tryConvert(temperature, toFahrenheit) : temperature;
    
        return (
          <div>
            <TemperatureInput
              scale="c"
              temperature={celsius}
              onTemperatureChange={this.handleCelsiusChange} />
            <TemperatureInput
              scale="f"
              temperature={fahrenheit}
              onTemperatureChange={this.handleFahrenheitChange} />
            <BoilingVerdict
              celsius={parseFloat(celsius)} />
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <Calculator />,
      document.getElementById('root')
    );
    
    </script>
    </body>
    </html>

    13.组合(children)

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    <style type="text/css">
    .FancyBorder {
      padding: 10px 10px;
      border: 10px solid;
    }
    
    .FancyBorder-blue {
      border-color: blue;
    }
    
    .Dialog-title {
      margin: 0;
      font-family: sans-serif;
    }
    
    .Dialog-message {
      font-size: larger;
    }
    </style>
    </head>
    <body>
    <div id="root"></div>
    <script type="text/babel">
    function FancyBorder(props) {
      return (
        <div className={'FancyBorder FancyBorder-' + props.color}>
          {props.children}
        </div>
      );
    }
    
    function WelcomeDialog() {
      return (
        <FancyBorder color="blue">
          <h1 className="Dialog-title">
            Welcome
          </h1>
          <p className="Dialog-message">
            Thank you for visiting our spacecraft!
          </p>
        </FancyBorder>
      );
    }
    
    ReactDOM.render(
      <WelcomeDialog />,
      document.getElementById('root')
    );
    </script>
    </body>
    </html>

    14.组合(多个占位符)

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>Hello World</title>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
    <style type="text/css">
    html, body, #root {
       100%;
      height: 100%;
    }
    
    .SplitPane {
       100%;
      height: 100%;
    }
    
    .SplitPane-left {
      float: left;
       30%;
      height: 100%;
    }
    
    .SplitPane-right {
      float: left;
       70%;
      height: 100%;
    }
    
    .Contacts {
       100%;
      height: 100%; 
      background: lightblue;
    }
    
    .Chat {
       100%;
      height: 100%; 
      background: pink;
    }
    
    </style>
    </head>
    <body>
    <div id="root"></div>
    <script type="text/babel">
    function Contacts() {
      return <div className="Contacts" />;
    }
    
    function Chat() {
      return <div className="Chat" />;
    }
    
    function SplitPane(props) {
      return (
        <div className="SplitPane">
          <div className="SplitPane-left">
            {props.left}
          </div>
          <div className="SplitPane-right">
            {props.right}
          </div>
        </div>
      );
    }
    
    function App() {
      return (
        <SplitPane
          left={
            <Contacts />
          }
          right={
            <Chat />
          } />
      );
    }
    
    ReactDOM.render(
      <App />,
      document.getElementById('root')
    );
    
    </script>
    </body>
    </html>














  • 相关阅读:
    HDU 5585 Numbers
    HDU 3308 LCIS
    POJ 2991 Crane
    POJ 1436 Horizontally Visible Segments
    POJ 3667 Hotel
    HaiHongOJ 1003 God Wang
    【SDOI 2008】 递归数列
    5月19日省中提高组题解
    【HDU 1588】 Gauss Fibonacci
    【POJ 3233】Matrix Power Series
  • 原文地址:https://www.cnblogs.com/xutongbao/p/9924861.html
Copyright © 2011-2022 走看看