渲染

作者: SingleDiego | 来源:发表于2019-01-21 11:12 被阅读10次

    ReactDOM.render

    ReactDOM.render 是 React 的最基本方法,用于将模板转为 HTML 语言,并插入指定的 DOM 节点。

    ReactDOM.render(
      <h1>Hello, world!</h1>,
      document.getElementById('example')
    );
    




    JSX

    JSX, 是一种 JavaScript 的语法扩展。 我们推荐在 React 中使用 JSX。

    使用 JSX, 可以在 JavaScript 中直接写 HTML,不加任何引号,它允许 HTML 与 JavaScript 的混写。

    ReactDOM.render(
            <div>
            {
              names.map(function (name) {
                return <div>Hello, {name}!</div>
              })
            }
          </div>,
          document.getElementById('example')
        );
    

    上面代码体现了 JSX 的基本语法规则:遇到 HTML 标签(以 <> 开头),就用 HTML 规则解析。

    遇到代码块(以 {} 开头),就用 JavaScript 规则解析。

    JSX 允许直接在模板插入 JavaScript 变量。如果这个变量是一个数组,则会展开这个数组的所有成员:

    var arr = [
        <h1>Hello world!</h1>,
        <h2>React is awesome</h2>,
    ];
    
    ReactDOM.render(
        <div>{arr}</div>,
        document.getElementById('example')
    );
    




    组件

    React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件。

    使用 class ComponentName extends React.Component 来创建一个组件类。

    ps:在 v16.0之前,React 使用 React.createClass() 来创建组件类,现在已被弃用

    class HelloMessage extends React.Component {
          render() {
            return <h1>Hello {this.props.name}</h1>;
          }
        }
    
    ReactDOM.render(
          <HelloMessage name="John" />,
          document.getElementById('example')
        );
    

    上面代码中,变量 HelloMessage 就是一个组件类。模板插入 <HelloMessage /> 时,会自动生成 HelloMessage 的一个实例。

    所有组件类都必须有自己的 render 方法,用于输出组件。

    注意,组件类的第一个字母必须大写,否则会报错。另外,组件类只能包含一个顶层标签,否则也会报错。

    组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloMessage name="John"> ,就是 HelloMessage 组件加入一个 name 属性,值为 John。

    组件的属性可以在组件类的 this.props 对象上获取,比如 name 属性就可以通过 this.props.name 读取。




    this.props.children

    this.props 对象的属性与组件的属性一一对应,但是有一个例外,就是 this.props.children 属性。它表示组件的所有子节点。

    class NotesList extends React.Component {
      render() {
        return (
          <ol>
            {
              React.Children.map(this.props.children, function (child) {
                return <li>{child}</li>;
              })
            }
          </ol>
        );
      }
    }
    
    ReactDOM.render(
      <NotesList>
        <span>hello</span>
        <span>world</span>
      </NotesList>,
      document.getElementById('example')
    );
    

    上面代码的 NoteList 组件有两个 span 子节点,它们都可以通过 this.props.children 读取。

    这里需要注意,this.props.children 的值有三种可能:

    • 如果当前组件没有子节点,它就是 undefined

    • 如果有一个子节点,数据类型是 object

    • 如果有多个子节点,数据类型就是 array

    React 提供一个工具方法 React.Children 来处理 this.props.children。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型是 undefined 还是 object

    更多 React.Children 的用法见:官方文档




    PropTypes

    组件的属性可以接受任意值,字符串、对象、函数等等都可以。有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求。

    var data = 123;
    
    class MyTitle extends React.Component {
      static propTypes = {
        // 要求 title 参数是必须的,且为字符串
        title: PropTypes.string.isRequired,
      }
      render() {
        return <h1> {this.props.title} </h1>;
      }
    }
    
    ReactDOM.render(
      <MyTitle title={data} />,
      document.getElementById('example')
    );
    

    上面的 Mytitle 组件有一个 title 属性。PropTypes 告诉 React,这个 title 属性是必须的,而且它的值必须是字符串。如果提供了错误的参数,会在控制台显示错误信息。

    上例中,我们提供的是数字 123,控制台会显示错误信息:

    Warning: Failed prop type: Invalid prop `title` of type `number` supplied to `MyTitle`, expected `string`.
    in MyTitle
    

    如果想给参数设定默认值,可以使用 defaultProps

    class MyTitle extends React.Component {
      static propTypes = {
        title: PropTypes.string.isRequired,
      };
    
      render() {
        return <h1> {this.props.title} </h1>;
      };
    }
    
    MyTitle.defaultProps = {
      title: "Holle World!"
    };
    
    ReactDOM.render(
      <MyTitle />,
      document.getElementById('example')
    );
    

    未提供参数的时候就会使用默认值:Holle World!

    更多 PropTypes 的用法见:官方文档

    相关文章

      网友评论

          本文标题:渲染

          本文链接:https://www.haomeiwen.com/subject/ulbqjqtx.html