React-高级指引

一、Fragments

react的组件在返回多个元素时,必须要用一个元素包裹起来,否则会报错,但是比如在表格中返回的列里加入了一个div如下:

则会导致html无效,所以react支持使用React.Fragment将多个元素包裹起来,这样并不会在html中添加任何元素。

在不需要key或其他属性时,还可以用一种更简洁的语法来实现:

class Columns extends React.Component {
  render() {
    return (
      <>
        <td>Hello</td>
        <td>World</td>
      </>
    );
  }
}

 

二、Label标签

在react中,Label标签的for被写作htmlFor,用来寻找id为xxx的表单:

<label htmlFor="namedInput">Name:</label>
<input id="namedInput" type="text" name="name"/>

 

三、如何找到各个DOM节点?

react可以通过给标签添加ref来操作各个标签,并且可以被传递到子组件中:

class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);
    // 创造一个 textInput DOM 元素的 ref
    this.textInput = React.createRef();
  }
  render() {
  // 使用 `ref` 回调函数以在实例的一个变量中存储文本输入 DOM 元素
  //(比如,this.textInput)。
    return (
      <input
        type="text"
        ref={this.textInput}
      />
    );
  }
}
// 通过ref找到这个标签
focus() {
  // 使用原始的 DOM API 显式地聚焦在 text input 上
  // 注意:我们通过访问 “current” 来获得 DOM 节点
  this.textInput.current.focus();
}

 

四、JSX

JSX实际上只是React.createElement(comonent, props, ...children)的语法汤,自定义的组件必须大写字母开头,因为小写字母开头的组件会被自动渲染成html标签,而大写字母开头的才会自动变成React.createElement(...)。

React元素类型不能是一个表达式,如果需要动态获取需要渲染的组件,可以通过一个大写字母开头的变量来获取:

const components = {
  photo: PhotoStory,
  video: VideoStory
};

function Story(props) {
  // 正确!JSX 类型可以是大写字母开头的变量。
  const SpecificStory = components[props.storyType];
  return <SpecificStory story={props.story} />;
}

 

五、可以使用高阶组件控制功能开关

// featureToggle.js
const isFeatureOn = function (featureName) {
  // return true or false
};

import { isFeatureOn } from './featureToggle';

const toggleOn = (featureName, ComposedComponent) => class HOC extends Component {
  render() {
    return isFeatureOn(featureName) ? <ComposedComponent {...this.props} /> : null;
  }
};

// 用法
import AdsComponent from './Ads'
const Ads = toggleOn('ads', AdsComponent);

 

六、父组件可以给子组件传递children

const SampleComponent = () => {
  <Parent>
    <Child />
  </Parent>
};

const Parent = () => {
  // 你能使用class 'bla'或者其他的class来给子组件加上不同的样式.
  <div className="bla">
    {this.props.children}
  </div>
};

包裹组件同样可以通过接收一个tag名来生成对应的HTML标签. 但是一般情况下我们不推荐这么做, 因为这样做的话你就不能添加属性或者传入props了.

const SampleComponent = () => {
  <Wrap tagName="div" content="Hello World" />
};

const Wrap = ({ tagName, content }) => {
  const Tag = `${tagName}`     // 变量名必须大写开头因为这是一个组件.
  return <Tag>{content}</Tag>
}

 

posted @ 2020-02-11 21:19  不可思议的猪  阅读(278)  评论(0编辑  收藏  举报