React学习(记录二)

31 阅读2分钟

说明一下:不管用什么工具构建项目,关注点要放在react的语法和写法上面,我只是自己学习记录,谢谢各位;

React基础

组件内部状态

组件内部状态也被称为局部状态,允许你保存、修改和删除存储在组件内部属性。使用 ES6 类组件可以在构造函数中初始化组件的状态。 构造函数只会在组件初始化时调用一次。

    class App extends Component {
        constructor(prop){
            super(prop)
        }
      
      render(){
          return (
              <div><div>
          )
       } 
   }      
             

这是一个简单的类组件:当你使用 ES6 编写的组件有一个构造函数时,它需要强制地调用 super(); 方法,因为这个 App 组件是 Component 的子类。因此在你的APP组件要声明 extends Component 。 你也可以调用 super(props);,它会在你的构造函数中设置 this.props 以供在构造函数中访问它们。 否则当在构造函数中访问 this.props ,会得到 undefined

react类组件的数据状态都要存储在state中,修改时也必须使用setState()方法,在修改state中的数据状态后,render函数会再次运行,这样就会重新渲染,使你修改之后的状态展示在页面上。
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={this.state.logo} className="App-logo" alt="logo" />
          <span>{this.state.count}</span>
          <button onClick={() => this.setState({ count: this.state.count + 1 })}>
            +1
          </button>
        </header>
      </div>
    );
  }
}

每次点击按钮都会使用 setState 使count +1;React的单向数据流:你点击的按钮触发方法,然后通过setState方法修改组件的state。最后render函数运行重新渲染页面。

另注意在类组件中尽量使用回调函数来绑定方法

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }
  // 计算方法 
  add () {
    this.setState({
      count: this.state.count + 1,
    });
  };


  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={this.state.logo} className="App-logo" alt="logo" />
          <span>{this.state.count}</span>
          <button onClick={this.add}>
            +1
          </button>
        </header>
      </div>
    );
  }
}

此方法会在点击是报错,因为类组件的方法不会自动绑定到this上,所以this这时是undefined;

这个问题当然可以解决比如用bind绑定this 写在构造函数中,但是那样写第一会对性能不好,也比较麻烦和难读。我们自然会越简单越好,改成下面的回调函数就好了:回调函数的this会一直指向本类组件;

 // 计算方法 
  add = () => {
    this.setState({
      count: this.state.count + 1,
    });
  };

方法在render的执行

还有一个需要注意到的点:传给元素事件处理器的内容必须是函数。

下面的代码中 点击按钮并不会发生任何事,控制台也不会打印,只有第一次进入的时候会打印;

  onBtnClick = () => {
    console.log('点击了按钮')
  };

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={this.state.logo} className="App-logo" alt="logo" />
          <span>{this.state.count}</span>
          <button onClick={this.onBtnClick()}>
            按钮
          </button>
        </header>
      </div>
    );
  }

下面的代码可以正常运行

onBtnClick = () => {
    console.log('点击了按钮')
  };

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={this.state.logo} className="App-logo" alt="logo" />
          <span>{this.state.count}</span>
          <button onClick={this.onBtnClick}>
            按钮
          </button>
        </header>
      </div>
    );
  }

如果需要获取dom上的参数 我们可以使用回调函数来进行传参 写成下面的就可以了

 onBtnClick = (msg) => {
    console.log(msg)
  };

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={this.state.logo} className="App-logo" alt="logo" />
          <span>{this.state.count}</span>
          <button onClick={()=>this.onBtnClick('点击了按钮')}>
            按钮
          </button>
        </header>
      </div>
    );
  }