zoukankan      html  css  js  c++  java
  • react小知识

    概述

    有句话说得很好,代码是写给人看的,顺便让机器执行而已。所以我总结了一些写react不太注意的地方,供以后开发时参考,相信对其他人也有用。

    组件封装

    由于组件其实就是React.createElement()函数的语法糖,所以如果一个单一模块要导出多个组件时,可以把它封装在一个类里面。

    import React from 'react';
    
    const MyComponents = {
      DatePicker: function DatePicker(props) {
        return <div>Imagine a {props.color} datepicker here.</div>;
      }
    }
    
    function BlueDatePicker() {
      return <MyComponents.DatePicker color="blue" />;
    }
    

    默认props(属性)

    如果没有给prop传值,那么他默认为true。比如说下面的例子是等价的。

    <MyTextBox autocomplete />
    
    <MyTextBox autocomplete={true} />
    

    antd里面有很多组件的属性都是这种默认写法的,但是react官方并不建议使用这种类型,因为这会与ES6中的对象shorthand混淆 。ES6 shorthand 中 {foo} 指的是 {foo: foo} 的简写,而不是 {foo: true} 。

    props.children

    jsx表达式中可以包含开放标签和闭合标签,标签中的内容会被传递给props.children。这个props.children可以是字符串,也可以是js函数,还可以是组件。如果是this.props.children,则表示在渲染的时候传递给组件的所有子节点

    比如下面的react-router中的例子,详情请看Index Routes

    import React from 'react'
    import { Link } from 'react-router'
    
    export default React.createClass({
      render() {
        return (
          <div>
            <h2>Repos</h2>
            <ul>
              <li><Link to="/repos/reactjs/react-router">React Router</Link></li>
              <li><Link to="/repos/facebook/react">React</Link></li>
            </ul>
            {this.props.children}
          </div>
        )
      }
    })
    

    组件为函数

    在一个module里面,不exports的组件最好写在外面

    //推荐写法,写在外面,很清晰
    function Item(props) {
      return <li>{props.message}</li>;
    }
    
    function TodoList() {
      const todos = ['finish doc', 'submit pr', 'nag dan to review'];
      return (
        <ul>
          {todos.map((message) => <Item key={message} message={message} />)}
        </ul>
      );
    }
    
    //不推荐
    function TodoList() {
      const todos = ['finish doc', 'submit pr', 'nag dan to review'];
      return (
        <ul>
          {todos.map((message) => <li key={message}> {message} </li>)}
        </ul>
      );
    }
    

    条件渲染的优雅写法

    由于false,null,undefined,和 true在渲染的时候会被忽略,所以可以如下优雅的写条件渲染。

    //第一种
    <div>
      {showHeader && <Header />}
      <Content />
    </div>
    
    //第二种
    <div>
      {props.messages.length &&
        <MessageList messages={props.messages} />
      }
    </div>
    

    需要注意的是,数值 0会被打印,所以一般写成如下形式:

    //第一种
    <div>
      {!!showHeader && <Header />}
      <Content />
    </div>
    
    //第二种
    <div>
      {props.messages.length > 0 &&
        <MessageList messages={props.messages} />
      }
    </div>
    

    propTypes

    可以用propTypes来指定props的属性的类型,注意这只在开发模式中有效。

    import PropTypes from 'prop-types';
    
    class MyComponent extends React.Component {
      render() {
        // 这里必须是一个元素,否则会发出警告。
        const children = this.props.children;
        return (
          <div>
            {children}
          </div>
        );
      }
    }
    
    MyComponent.propTypes = {
      children: PropTypes.element.isRequired
    };
    

    defaultProps

    可以用defaultProps给props设置默认值,这样如果没有值的时候就不会报错了。

    class Greeting extends React.Component {
      render() {
        return (
          <h1>Hello, {this.props.name}</h1>
        );
      }
    }
    
    // 指定 props 的默认值:
    Greeting.defaultProps = {
      name: 'Stranger'
    };
    
    // 渲染为 "Hello, Stranger":
    ReactDOM.render(
      <Greeting />,
      document.getElementById('example')
    );
    
  • 相关阅读:
    刘志博 作业 2.15
    刘志博 作业2.6
    作业一
    2.6
    张靖悦
    java 2.15
    java 2.6
    java 1.12
    java 1.8
    java 1.3
  • 原文地址:https://www.cnblogs.com/yangzhou33/p/8620726.html
Copyright © 2011-2022 走看看