学习笔记:React组件

2021-03-25  本文已影响0人  双鱼子曰1987

一、前沿

React主要的作用是提高前端开发MVC架构中的View开发效率。提高前端页面的代码复用率、简化前端数据绑定、提升前端页面的渲染性能等工作。
在前端页面代码(html、css等)的复用上,React采用的是组件化,通过组件化封装前端页面代码,做到可复用可移植。
因此,对于学习React,对于组件的掌握至关重要,可以说组件是react的主要内容。

二、组件

2.1、定义一个组件

// 使用props向组件传递参数
function HelloMessage(props) {
    return <h1>Hello {props.name}!</h1>;
}
const element = <HelloMessage name="tom"/>;

//调用函数软如
ReactDOM.render(element, document.getElementById('root'));
class HelloWorld extends React.Component {
  render() {
    return <h1>Hello World!</h1>;
  }
}

2.2、组件的样式:

<head>
<style>
.pStyle {
    font-size:30px;
}
</style>
</head>

var hStyle = {
    backgroundColor: "green",
    color: "red"
}
 
var ShowMessage = React.createClass({
    render: function() {
        return (
            <div style={{ backgroundColor:"yellow", borderWidth:5, borderColor:"brack", broderStyle:"solid" }}> // 内联样式
                <h1 style={hStyle}>{this.props.firstRow}</h1> // 对象样式
                <p className="pStyle">{this.props.secondRow}</p> // 选择器样式,注意因为Class为关键字,只能ClassName指定样式。
            </div>
        );
    }
});

ReactDOM.render(
    <ShowMessage firstRow="你好" secondRow="小豆豆" />,
    document.getElementById("container")
);
注意:在React和HTML5中设置样式时的书写格式是有区别的

2.3、复合组件

支持将多个自定义组件合成一个组件,方法和定义组件时候聚合HTML标签一样。

render: function() {
        return (
            <HelloWorld>
                  <NameLbl></NameLbl >
            </HelloWorld >
        );
}

2.4、使用规范

三、组件的声明周期

3.1、组件的三种状态:

3.2、组件的声明周期函数

a、组件挂载:
b、组件更新:
c、组件移除:
d、与组件的props、state有关:

getDefaultProps 设置props属性的默认值
getInitialState 设置state属性的初始值。

// ES6语法,class
class Content extends React.Component {
  componentWillMount() {
      console.log('Component WILL MOUNT!')
  }
  componentDidMount() {
       console.log('Component DID MOUNT!')
  }
  componentWillReceiveProps(newProps) {
        console.log('Component WILL RECEIVE PROPS!')
  }
  shouldComponentUpdate(newProps, newState) {
        return true;
  }
  componentWillUpdate(nextProps, nextState) {
        console.log('Component WILL UPDATE!');
  }
  componentDidUpdate(prevProps, prevState) {
        console.log('Component DID UPDATE!')
  }
  componentWillUnmount() {
         console.log('Component WILL UNMOUNT!')
  }
 
render() {
    return (
        <div>
          <h3>{this.props.myNumber}</h3>
        </div>
  );
} // render

} // class

// 组件渲染
ReactDOM.render(
   <div>
      <Button />
   </div>,
  document.getElementById('example')
);

四、Props

实例:定义HelloWorld组件,里面通过props接收父组件的属性title。

class HelloWorld extends React.Component {
  // 渲染核心函数
  render() {
    return (
      <div>
        <h1>Hello, {this.props.title} !</h1>
        <Clock></Clock>
        <TapButton></TapButton>
      </div>
    )
  }
}

// 使用HelloWorld组件
< HelloWorld  title='xxx'></HelloWorld>
class Link extends React.Component {
     render() {
        return <a {...this.props}>{this.props.name}</a>;
    }
}

ReactDOM.render(
   <Link href='https://www.baidu.com' name='tom'>,
  document.getElementById('example')
);
class Link extends React.Component {
    getDefaultProps() {
        return {
              title:"默认标题"
        }
    },
     render() {
        return <a>{this.props.title}</a>;
    }
}

五、State

class Clock extends React.Component {
  // 构造函数
  constructor(props) {
    super(props);

    // 定义state里面的 date 属性
    this.state = {date: new Date()};
  }

  // 声明周期
  componentDidMount() {
    this.timer = setInterval(
      () => this.timerHandler(),
      1000
    );
  }

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

  // 渲染核心函数
  render() {
    return (
        <h2> today is {this.state.date.toLocaleTimeString()}</h2>
    )
  }

  // custom
  timerHandler() {
    // 更新 state.date 属性
    this.setState({
      date: new Date()
    });
  }
}
上一篇下一篇

猜你喜欢

热点阅读