美文网首页
【教程】react教程(精简)

【教程】react教程(精简)

作者: giraffecode9668 | 来源:发表于2019-11-17 00:45 被阅读0次

    react 教程

    一、React安装

    参考:小结点node博客-react的安装与使用

    1 、 使用npm安装脚手架工具create-react-app

    npm install -g create-react-app
    

    2、使用脚手架工具create-react-app创建项目

    - 在需要创建项目的位置打开命令行
    - 输入create-react-app + 项目名称的命令,比如:
    
    create-react-app todolist
    
    - 当项目创建完成后,可以进入项目,并启动:
    
    cd todolist
    npm start
    
    • 项目启动之后浏览器显示
    react启动.png
    新生命周期.png

    3、项目目录结构

    参考:菜鸟教程

    my-app/
      README.md
      node_modules/
      package.json
      .gitignore
      public/
        favicon.ico
        index.html
        manifest.json   
      src/
        App.css
        App.js
        App.test.js
        index.css
        index.js
        logo.svg
    

    二、React技术

    1、元素表示

    元素是构成 React 应用的最小单位,它用于描述屏幕上输出的内容,有:constletvar

    三者区别:

    • const 在 ES6 中,const 只限制对应的变量不能够被再次赋值;但是变量的属性可以被再次赋值。
    • let 避免重复定义了变量,无意间修改了全局变量;是定义block local variable的。
    • var 非常灵活

    参考 :ES6 中 let, var, const 的区别

    2、常用函数

    函数1:ReactDOM.render(x,x);渲染元素

    // 定义一个元素
    const element = <h1>Hello, world!</h1>;
    
    /**
     * ReactDOM.render(标签元素内容, document.getElementById('元素id'))
     * 将元素内容渲染到指定元素
     */
    ReactDOM.render(
        element,
        document.getElementById('divId')
    );
    
    

    函数2:setInterval(function, 秒数);计时器

    function tick() {
      const element = (
        <div>
          <h1>Hello, world!</h1>
          <h2>现在是 {new Date().toLocaleTimeString()}.</h2>
        </div>
      );
      ReactDOM.render(
        element,
        document.getElementById('example')
      );
    }
     
    setInterval(tick, 1000);
    

    函数3:function name(参数)方法可以成为一个元素

    // props是参数,方法之中获得参数,直接调用props.自定义.xx
    function Clock(props) {
      return (
        <div>
          <h1>Hello, world!</h1>
          <h2>现在是 {props.date.toLocaleTimeString()}.</h2>
        </div>
      );
    }
    
    <Clock date={new Date()} />
    

    函数4:class name extends React.Component{}类可以成为一个元素

    // React内置render调用方法,需要调用参数时,应该取变量this.props.xx.xx
    class Clock extends React.Component {
      render() {
        return (
          <div>
            <h1>Hello, world!</h1>
            <h2>现在是 {this.props.date.toLocaleTimeString()}.</h2>
          </div>
        );
      }
    }
    
    <Clock date={new Date()} />
    

    函数5:JSX支持JavaScript表达式,表达式写在{}中

    ReactDOM.render(
        <div>
          <h1>{1+1}</h1>
        </div>
        ,
        document.getElementById('example')
    );
    
    ReactDOM.render(
        <div>
          <h1>{i == 1 ? 'True!' : 'False'}</h1>
        </div>
        ,
        document.getElementById('example')
    );
    

    函数6:JSX元素支持样式

    var myStyle = {
        fontSize: 100,
        color: '#FF0000'
    };
    ReactDOM.render(
        <h1 style = {myStyle}>菜鸟教程</h1>,
        document.getElementById('example')
    );
    

    函数7:html注释需写在{}中

    ReactDOM.render(
        <div>
        <h1>菜鸟教程</h1>
        {/*注释...*/}
         </div>,
        document.getElementById('example')
    );
    

    函数8:JSX支持元素数组

    var arr = [
      <h1>菜鸟教程</h1>,
      <h2>学的不仅是技术,更是梦想!</h2>,
    ];
    ReactDOM.render(
      <div>{arr}</div>,
      document.getElementById('example')
    );
    

    函数9:&&运算

    // true && 输出;false && 什么也不做
    {
         unreadMessages.length > 0 &&
            <h2>
              您有 {unreadMessages.length} 条未读信息。
            </h2>
      }
    

    函数10:三目运算

    render() {
      const isLoggedIn = this.state.isLoggedIn;
      return (
        <div>
          {isLoggedIn ? (
            <LogoutButton onClick={this.handleLogoutClick} />
          ) : (
            <LoginButton onClick={this.handleLoginClick} />
          )}
        </div>
      );
    }
    

    函数11:map列举,注意使用map时最好加上key

    const numbers = [1, 2, 3, 4, 5];
    const listItems = numbers.map((numbers) =>
      <li>{numbers}</li>
    );
    
    ReactDOM.render(
      <ul>{numbers}</ul>,
      document.getElementById('example')
    );
    

    函数12:this.setState设置状态

    /**
     * 方法一
     */
     class Counter extends React.Component{
      constructor(props) {
          super(props);
          this.state = {clickCount: 0};
          this.handleClick = this.handleClick.bind(this);
      }
      
      handleClick() {
        this.setState(function(state) {
          return {clickCount: state.clickCount + 1};
        });
      }
      render () {
        return (<h2 onClick={this.handleClick}>点我!点击次数为: {this.state.clickCount}</h2>);
      }
    }
    ReactDOM.render(
      <Counter />,
      document.getElementById('example')
    );
    
    /**
     * 方法二
     */
     this.setState({
          date: new Date()
        });
    

    函数13:replaceStatesetPropsreplacePropsforceUpdatefindDOMNodeisMounted

    3、生命周期

    旧的生命周期


    旧生命周期.png

    新的生命周期


    新生命周期.png

    通过对state变量更新自动更新组件

    • 调用componentDidMount()componentWillUnmount()钩子
    • componentDidMount() 中添加更新state,使用定时器等
    • componentWillUnmount()中卸载缓存,定时器等
    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>现在是 {this.state.date.toLocaleTimeString()}.</h2>
          </div>
        );
      }
    }
     
    ReactDOM.render(
      <Clock />,
      document.getElementById('example')
    );
    

    fuction 中的this是function本身,JSX表达式{}中this时Component类的指代

    state 和 props的区别

    • state是组件自身拥有,自身可以改变;
    • props是父组件传递下去的,自身不可以改变
    class WebSite extends React.Component {
      constructor() {
          super();
     
          this.state = {
            name: "菜鸟教程",
            site: "https://www.runoob.com"
          }
        }
      render() {
        return (
          <div>
            <Name name={this.state.name} />
            <Link site={this.state.site} />
          </div>
        );
      }
    }
     
     
     
    class Name extends React.Component {
      render() {
        return (
          <h1>{this.props.name}</h1>
        );
      }
    }
     
    class Link extends React.Component {
      render() {
        return (
          <a href={this.props.site}>
            {this.props.site}
          </a>
        );
      }
    }
     
    ReactDOM.render(
      <WebSite />,
      document.getElementById('example')
    );
    

    props 设置默认值

    HelloMessage.defaultProps = {
      name: 'Runoob'
    };
    

    4、点击事件

    • onClick={}

    • {}调用的是中间变量,存在的问题是事件的this指代的实例会消失

    参考:React事件处理函数必须使用bind(this)的原因

    /**
     * 方法一:构造器绑定
     */
    class Popper extends React.Component{
        constructor(){
            super();
            this.state = {name:'Hello world!'};
        }
        
        preventPop(name, e){    //事件对象e要放在最后
            e.preventDefault();
            alert(name);
        }
        
        render(){
            return (
                <div>
                    <p>hello</p>
                    {/* 通过 bind() 方法传递参数。 */}
                    <a href="https://reactjs.org" onClick={this.preventPop.bind(this,this.state.name)}>Click</a>
                </div>
            );
        }
    }
    
    
    /**
     * 方法二:方法调用中绑定
     */
    class Toggle extends React.Component {
      constructor(props) {
        super(props);
        this.state = {isToggleOn: true};
     
        // 点击事件的方法绑定当前实例
        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('example')
    );
    
    /**
     * 方法三:使用function方法调用
     */
    class LoggingButton extends React.Component {
      handleClick(e) {
        console.log('this is:', this);
      }
     
      render() {
        //  这个语法确保了 `this` 绑定在  handleClick 中
        return (
          <button onClick={(e) => this.handleClick(e)}>
            Click me
          </button>
        );
      }
    }
    
    /**
     * 方法四:使用function方法调用
     */
    class LoggingButton extends React.Component {
      handleClick = () => {
        console.log('this is:', this);
      }
     
      render() {
        //  这个语法确保了 `this` 绑定在  handleClick 中
        return (
          <button onClick={this.handleClick}>
            Click me
          </button>
        );
      }
    }
    

    5、AJAX请求

    • React本身不带有发送ajax的库,所以需要使用其他库
    • axios
    • fetch
    • jquery
    • ...
    /**
     * 使用jquery
     */
    $.get(this.props.source, function (result) {
          var lastGist = result[0];
          this.setState({
            username: lastGist.owner.login,
            lastGistUrl: lastGist.html_url
          });
        }.bind(this));
      )
      
    /**
     * 使用axios
     */
     axios.post(url,{参数对象})
          .then(response=>{
            console.log(response)
          })
          .catch(error =>{
                console.log(error.message)
          })
    
    /**
     * 使用fetch
     */
    loadCommentsFromServer: function() {
        fetch(this.props.url).then(function(response){
            // 在这儿实现 setState
        });
    }
    
    // 当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。
    componentWillUnmount() {
        this.serverRequest.abort();
      }
    

    相关文章

      网友评论

          本文标题:【教程】react教程(精简)

          本文链接:https://www.haomeiwen.com/subject/hgwuictx.html