参考:
b站视频(推荐)
react官网入门教程

html方式引用react

基础示例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div id="like_button_container"></div>
  9. <!-- 加载 React。-->
  10. <!-- 注意: 部署时,将 "development.js" 替换为 "production.min.js"。-->
  11. <!--<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>-->
  12. <!--<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>-->
  13. <!--cdn使用-->
  14. <!--<script src="https://unpkg.com/react@16/umd/react.production.min.js" crossorigin></script>-->
  15. <!--<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js" crossorigin></script>-->
  16. <!--必备JSX插件,转换jsx文件-->
  17. <!--<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>-->
  18. <script src="react.development.js"></script>
  19. <script src="react-dom.development.js"></script>
  20. <script src="like_button.js" type="text/babel"></script>
  21. </body>
  22. </html>

like_button.js

  1. 'use strict';
  2. const e = React.createElement;
  3. class LikeButton extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = { liked: false };
  7. }
  8. render() {
  9. if (this.state.liked) {
  10. return 'You liked this.';
  11. }
  12. return (
  13. <button onClick={()=>this.setState({liked: true})}>
  14. Like
  15. </button>
  16. );
  17. }
  18. }
  19. const domContainer = document.querySelector('#like_button_container');
  20. ReactDOM.render(e(LikeButton), domContainer);

改进JSX

上面的这种方法会在线转换JSX文件,效果不太好,所以我们可以提前编译,创建src文件夹

  1. npm init -y
  2. npm install babel-cli@6 babel-preset-react-app@3

这个命令不会停止,会监视src目录下的jsx文件,并在根目录转换为正常js文件。

image.png

然后要去除html中的 type="text/babel" ,就是说正常即可。

脚手架

create-react-app

  1. # 创建项目
  2. npx create-react-app my-app
  3. cd my-app
  4. npm start


  • public/index.html 是页面模板;
  • src/index.js 是 JavaScript 入口点。

基础

组件

函数组件

  1. function Welcome(props) {
  2. return <h1>Hello, {props.name}</h1>;
  3. }

class组件

  1. class Welcome extends React.Component {
  2. render() {
  3. return <h1>Hello, {this.props.name}</h1>;
  4. }
  5. }

组件的使用

示例1:

  1. function Welcome(props) {
  2. return <h1>Hello, {props.name}</h1>;
  3. }
  4. const element = <Welcome name="Sara" />;
  5. ReactDOM.render(
  6. element,
  7. document.getElementById('root')
  8. );

示例2:

  1. function Welcome(props) {
  2. return <h1>Hello, {props.name}</h1>;
  3. }
  4. function App() {
  5. return (
  6. <div>
  7. <Welcome name="Sara" />
  8. <Welcome name="Cahal" />
  9. <Welcome name="Edite" />
  10. </div>
  11. );
  12. }
  13. ReactDOM.render(
  14. <App />,
  15. document.getElementById('root')
  16. );

State & 生命周期

当需要state来修改内部数据的时候,我们要使用class组件。state必须使用set来赋值。
下面的例子为一个时钟,用到class的加载和卸载函数。

  1. class Clock extends React.Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = {date: new Date()};
  5. }
  6. componentDidMount() {
  7. this.timerID = setInterval(
  8. () => this.tick(),
  9. 1000
  10. );
  11. }
  12. componentWillUnmount() {
  13. clearInterval(this.timerID);
  14. }
  15. tick() {
  16. this.setState({
  17. date: new Date()
  18. });
  19. }
  20. render() {
  21. return (
  22. <div>
  23. <h1>Hello, world!</h1>
  24. <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
  25. </div>
  26. );
  27. }
  28. }
  29. ReactDOM.render(
  30. <Clock />,
  31. document.getElementById('root')
  32. );
  1. this.setState((state, props) => ({
  2. counter: state.counter + props.increment
  3. }));

事件处理

点击事件

  1. <button onClick={activateLasers}>
  2. Activate Lasers
  3. </button>

阻止默认事件,必须调用 e.preventDefault()

  1. function ActionLink() {
  2. function handleClick(e) {
  3. e.preventDefault();
  4. console.log('The link was clicked.');
  5. }
  6. return (
  7. <a href="#" onClick={handleClick}>
  8. Click me
  9. </a>
  10. );
  11. }

this的绑定

  1. class LoggingButton extends React.Component {
  2. // 此语法确保 `handleClick` 内的 `this` 已被绑定。
  3. // 注意: 这是 *实验性* 语法。
  4. handleClick = () => {
  5. console.log('this is:', this);
  6. }
  7. render() {
  8. return (
  9. <button onClick={this.handleClick}>
  10. Click me
  11. </button>
  12. );
  13. }
  14. }

条件渲染

  1. function Mailbox(props) {
  2. const unreadMessages = props.unreadMessages;
  3. return (
  4. <div>
  5. <h1>Hello!</h1>
  6. {unreadMessages.length > 0 &&
  7. <h2>
  8. You have {unreadMessages.length} unread messages.
  9. </h2>
  10. }
  11. </div>
  12. );
  13. }
  14. const messages = ['React', 'Re: React', 'Re:Re: React'];
  15. ReactDOM.render(
  16. <Mailbox unreadMessages={messages} />,
  17. document.getElementById('root')
  18. );

阻止组件渲染,返回null即可。

  1. function WarningBanner(props) {
  2. if (!props.warn) {
  3. return null;
  4. }
  5. return (
  6. <div className="warning">
  7. Warning!
  8. </div>
  9. );
  10. }
  11. class Page extends React.Component {
  12. constructor(props) {
  13. super(props);
  14. this.state = {showWarning: true};
  15. this.handleToggleClick = this.handleToggleClick.bind(this);
  16. }
  17. handleToggleClick() {
  18. this.setState(state => ({
  19. showWarning: !state.showWarning
  20. }));
  21. }
  22. render() {
  23. return (
  24. <div>
  25. <WarningBanner warn={this.state.showWarning} />
  26. <button onClick={this.handleToggleClick}>
  27. {this.state.showWarning ? 'Hide' : 'Show'}
  28. </button>
  29. </div>
  30. );
  31. }
  32. }
  33. ReactDOM.render(
  34. <Page />,
  35. document.getElementById('root')
  36. );

列表 key

key 帮助 React 识别哪些元素改变了,比如被添加或删除。因此你应当给数组中的每一个元素赋予一个确定的标识。

map() 方法中的元素需要设置 key 属性

  1. function NumberList(props) {
  2. const numbers = props.numbers;
  3. const listItems = numbers.map((number) =>
  4. <li key={number.toString()}>
  5. {number}
  6. </li>
  7. );
  8. return (
  9. <ul>{listItems}</ul>
  10. );
  11. }
  12. const numbers = [1, 2, 3, 4, 5];
  13. ReactDOM.render(
  14. <NumberList numbers={numbers} />,
  15. document.getElementById('root')
  16. );

表单

  1. class NameForm extends React.Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = {value: ''};
  5. this.handleChange = this.handleChange.bind(this);
  6. this.handleSubmit = this.handleSubmit.bind(this);
  7. }
  8. handleChange(event) {
  9. this.setState({value: event.target.value});
  10. }
  11. handleSubmit(event) {
  12. alert('提交的名字: ' + this.state.value);
  13. event.preventDefault();
  14. }
  15. render() {
  16. return (
  17. <form onSubmit={this.handleSubmit}>
  18. <label>
  19. 名字:
  20. <input type="text" value={this.state.value} onChange={this.handleChange} />
  21. </label>
  22. <input type="submit" value="提交" />
  23. </form>
  24. );
  25. }
  26. }

辅助工具

react插件:react snippets

image.png

eslint格式化

image.png


这短短的一生我们最终都会失去,不放大胆一点,爱一个人、攀一座山、追一个梦!