📜  反应材料 ui - Javascript (1)

📅  最后修改于: 2023-12-03 15:07:24.561000             🧑  作者: Mango

反应材料(React)中的UI和Javascript

React是一个开源的JavaScript库,广泛用于构建用户界面。它是一个组件化的库,允许你将UI拆分成独立的可重用部分。React使用一种称为JSX的语法来创建组件,并在底层使用JavaScript将其呈现在浏览器中。

组件

React的核心概念是组件。组件是可重用、自包含的UI部件,拥有自己的状态和生命周期方法。在React中,组件可以是函数式组件或类组件,两者都可以接收属性并在呈现时返回表示UI的元素。

函数式组件

函数式组件是一种简单的组件类型,它基本上只是接收属性并返回UI元素。这些组件通常用于表示静态UI,因为它们没有状态或生命周期方法。

function HelloWorld(props) {
  return (
    <div>
      Hello {props.name}!
    </div>
  );
}
类组件

类组件是一种更复杂的组件类型,它允许你定义状态和生命周期方法。类组件是一个ES6类,它扩展了React.Component类并实现了render()方法,这个方法返回表示UI的元素。

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      <div>
        Count: {this.state.count}
        <button onClick={this.handleClick}>Increment</button>
      </div>
    );
  }
}
Props

属性(props)是React组件的一种数据源。它们是由父组件传递给子组件的JavaScript对象,这些属性可以在组件内部使用。

function Greeting(props) {
  return <div>Hello, {props.name}!</div>;
}

ReactDOM.render(
  <Greeting name="John" />,
  document.getElementById('root')
);

在这个例子中,我们创建了一个Greeting组件,并将name属性设置为"John"。当组件被呈现时,它将显示"Hello, John!"。组件可以访问它们的属性作为props对象的属性。

State

状态(state)是组件的另一种数据源。状态是一个JavaScript对象,它存储了组件内部的数据,并且可以在组件生命周期中进行更改。当状态更新时,React会重新呈现组件。

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>
    );
  }
}

在这个例子中,我们创建了一个Clock组件,它有一个名为date的状态。当组件挂载时,我们启动一个计时器并在每秒更新日期状态。当组件卸载时,我们清除计时器以防止内存泄漏。

生命周期

React组件有几个生命周期方法,这些方法在组件挂载、卸载、更新时触发。生命周期方法允许你在组件不同状态下执行相应的操作,例如获取远程数据或进行一些清理工作。

挂载生命周期方法
  • constructor(props) - 组件首次被创建时调用。
  • render() - 生成HTML代码的函数将在此生命周期调用。
  • componentDidMount() - 组件已在DOM中呈现后立即调用。
class Hello extends React.Component {
  constructor(props) {
    super(props);
    console.log('constructor');
  }

  render() {
    console.log('render');
    return (
      <div>Hello, {this.props.name}</div>
    );
  }

  componentDidMount() {
    console.log('componentDidMount');
  }
}

ReactDOM.render(
  <Hello name="React" />,
  document.getElementById('root')
);

在这个例子中,我们创建了一个Hello组件,并在每个挂载生命周期方法中打印一些信息。当组件被首次创建时,constructor方法将被调用,然后会呈现render方法。最终,componentDidMount方法将在HTML代码生成后立即调用。

更新生命周期方法
  • shouldComponentUpdate(nextProps, nextState) - 每次组件将被更新时调用,这个方法应该返回一个布尔值。
  • render() - 此方法在shouldComponentUpdate返回true时调用。
  • componentDidUpdate(prevProps, prevState) - 当组件已更新时调用。
class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({ count: this.state.count + 1 });
  }

  shouldComponentUpdate(nextProps, nextState) {
    console.log('shouldComponentUpdate', nextProps, nextState);
    return true;
  }

  componentDidUpdate(prevProps, prevState) {
    console.log('componentDidUpdate', prevProps, prevState);
  }

  render() {
    console.log('render');
    return (
      <div>
        Count: {this.state.count}
        <button onClick={this.handleClick}>Increment</button>
      </div>
    );
  }
}

ReactDOM.render(
  <Counter />,
  document.getElementById('root')
);

在这个例子中,我们创建了一个Counter组件,并在每个更新生命周期方法中打印一些信息。组件的shouldComponentUpdate方法将在每次更新之前调用,它将作为接收当前属性和状态和下一个属性和状态的参数,并返回一个布尔值以指示组件是否应该更新。如果shouldComponentUpdate返回false,则组件的render和componentDidUpdate方法将不会被调用。

卸载生命周期方法
  • componentWillUnmount() - 组件将从DOM中卸载时调用。
class Hello extends React.Component {
  constructor(props) {
    super(props);
    this.state = { name: props.name };
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }

  tick() {
    this.setState({ name: 'React' });
  }

  render() {
    return (
      <div>Hello, {this.state.name}!</div>
    );
  }
}

ReactDOM.render(
  <Hello name="World" />,
  document.getElementById('root')
);

在这个例子中,我们创建了一个Hello组件,在其中启动了一个定时器来定期更新它的状态。当组件卸载时,我们清除计时器以防止内存泄漏。

总结

React是一个强大的JavaScript库,它允许你构建可重用的、独立的UI组件。通过使用组件、属性和状态,以及管理生命周期方法,React使构建复杂UI变得更加容易。无论你是正在创建一个小型应用程序还是一个大型Web应用程序,React都是一个值得学习的库。