• 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>
    }
  • 相关阅读:
    java基础学习笔记四(异常)
    关于linux下crontab mysql备份出来的数据为0字节的问题
    转:国内优秀npm镜像推荐及使用
    webpack使用总结~
    php下载远程文件方法~
    腾讯开放平台web第三方登录获取信息类(包含签名)
    windows 平台 php_Imagick 拓展遇到的那些坑!
    转:CentOS/Debian/Ubuntu一键安装LAMP(Apache/MySQL/PHP)环境
    composer 报错:Your requirements could not be resolved to an installable set of packages 解决方法
    Javascript模块化编程(三):require.js的用法
  • 原文地址:https://www.cnblogs.com/yinwenjie/p/12296838.html
Copyright © 2020-2023  润新知