渲染

作者: 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 的用法见:官方文档

相关文章

  • Shader-更复杂的光照-渲染路径

    渲染路径 前向渲染路径、延迟渲染路径和顶点照明渲染路径 1.前向渲染路径原理 前向渲染需要渲染该对象的渲染图元,并...

  • GPU & OpenGL相关 & 状态机 2022-06-15

    渲染分离线渲染(离线烘焙) 和 实时渲染。 实时渲染的技术实现分 普通渲染 和 光线追踪算法渲染https://w...

  • dot模板引擎

    基本模板 for 循环渲染 数组渲染 条件渲染

  • 什么是离屏渲染?

    渲染又分为离屏渲染与在屏渲染 ·On-Screen Rendering 意为当前屏幕渲染,指的是GPU的渲染操作是...

  • 图层性能-离屏渲染、光栅化等

    一.离屏渲染 1.在屏渲染、离屏渲染: On-Screen Rendering/在屏渲染:在屏渲染:指的是GPU的...

  • 学习并实现react (2)

    组件列表渲染场景 DOM复用 react 的重点在于首次渲染和更新渲染,现在考虑更新渲染如何复用DOM 让渲染更有...

  • Thearender2渲染器学习笔记之十五

    【前言】 本篇研究THEA的分层渲染技术。分层渲染也有叫分通道渲染技术,有的如VRAY渲染器也叫渲染元素。...

  • three.js基础

    1.三大组建 2.渲染器renderer 3.场景 4.渲染器 5.渲染循环 渲染有两种方式:实时渲染和离线渲染 ...

  • iOS 关于离屏渲染 Off-Screen Rendering

    1. 什么是离屏渲染 三种不同的渲染方式:屏幕渲染、离屏渲染和CPU渲染。屏幕渲染,在用于显示的屏幕缓冲区中进行,...

  • 四、离屏渲染

    离屏渲染与正常渲染 屏幕上最终显示的数据有两种加载流程 正常渲染加载流程 离屏渲染加载流程离屏渲染与正常渲染 常⻅...

网友评论

      本文标题:渲染

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