129_React笔记3_props和states

可以参考RN里的笔记:https://blog.csdn.net/a_horse/article/details/82628315

一,props

  1. 不可改变,初始化参数使用
    1. //props基本使用
      function HelloMessage(props) {
          return <h1>Hello {props.name}!</h1>;
      }
       
      const element = <HelloMessage name="Runoob"/>;
       
      ReactDOM.render(
          element,
          document.getElementById('example')
      );

       

  2. 默认参数
    1. 方法1:在组件内部的使用static defaultProps
    2. 方法2:在组件外部,使用组件名.defaultProps
       
    3. 示例
    4. class HelloMessage extends React.Component {
      
      //默认属性方法1
       static defaultProps = { 
            name: "菜鸟教程"}
      
        render() {
          return (
            <h1>Hello, {this.props.name}</h1>
          );
        }
      }
       
      //默认属性方法2
      HelloMessage.defaultProps = {
        name: 'Runoob'
      };
       
      const element = <HelloMessage/>;
       
      ReactDOM.render(
        element,
        document.getElementById('example')
      );

       

  3. prop验证
    1.  使用propTypes,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效
    2. 当向 props 传入无效数据时,JavaScript 控制台会抛出警告。
    3. 示例:
      1. var title = "菜鸟教程";
        // var title = 123;
        class MyTitle extends React.Component {
          render() {
            return (
              <h1>Hello, {this.props.title}</h1>
            );
          }
        }
         // 验证title参数必须是字符串类型
        MyTitle.propTypes = {
          title: PropTypes.string
        };
        ReactDOM.render(
            <MyTitle title={title} />,
            document.getElementById('example')
        );

         

二,states

  1. 状态机制,更新时使用
  2. 配合组件的生命周期,事件的触发来使用
  3. 更新状态使用setState
    1. // ❎错误
      this.state.comment = 'Hello';
      
      // ✅正确
      this.setState({comment: 'Hello'});

       

  4. 状态更新可能是异步的
    1. this.props 和 this.state 可能是异步更新的,你不应该依靠它们的值来计算下一个状态
    2. 应该setState() 来接受一个函数而不是一个对象。 该函数将接收先前的状态作为第一个参数,将此次更新被应用时的props做为第二个参数
    3. 例子:
      1. // ❎错误
        this.setState({
          counter: this.state.counter + this.props.increment,
        });
        
        // ✅正确
        this.setState((prevState, props) => ({
          counter: prevState.counter + props.increment
        }));
        
        上方代码使用了箭头函数,但它也适用于常规函数:
        // ✅正确
        this.setState(function(prevState, props) {
          return {
            counter: prevState.counter + props.increment
          };
        });
  5. 状态单独更新
    1.   constructor(props) {
          super(props);
          this.state = {
            posts: [],
            comments: []
          };
        }
      
      你可以调用 setState() 独立地更新它们:
        componentDidMount() {
          fetchPosts().then(response => {
            this.setState({
              posts: response.posts
            });
          });
      
          fetchComments().then(response => {
            this.setState({
              comments: response.comments
            });
          });
        }

       

  6. 数据自顶向下流动
    1. 状态通常被称为局部或封装。 除了拥有并设置它的组件外,其它组件不可访问。
    2. 子组件
      1. <h2>It is {this.state.date.toLocaleTimeString()}.</h2>

         

    3. 用户组件
      1. <FormattedDate date={this.state.date} />
        
        
        function FormattedDate(props) {
          return <h2>It is {props.date.toLocaleTimeString()}.</h2>;
        }

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值