相关文章推荐
没读研的奔马  ·  TypeScript Arrays·  4 周前    · 
年轻有为的鸵鸟  ·  Part 2 - Definitions ...·  3 月前    · 
玩足球的黄花菜  ·  d3-voronoi-map - npm·  1 年前    · 
首发于 前端茶馆
通俗易懂之React是如何渲染 UI

通俗易懂之React是如何渲染 UI

reatElement 方法

React.creatElement() 是用于创建 DOM 元素的顶级 API方法,类似于 Document.createElement()

React.createElement(type, props, content)
  • type参数是dom元素的标签:div, span, ul 或者 React 组件
  • props参数是标签的dom属性,null 或者一个对象
  • content参数是放在标签的内容,null, 字符串,React 元素或者React组件

demo sample

import React from 'react'
import ReactDOM from 'react-dom'
const element = React.createElement('div', null, 'hello world')
console.log(element)
ReactDOM.render(
  element,
  document.getElementById('root')

打印 element 出来看看:

console.log


在 React 应用中,通常会有一个 root 节点来当应用的的钩子,React 将会控制该区域并渲染 UI

<div id='root'></div>

ReactDOM是react 的一个库,可以使程序运行在浏览器中,脱离出来的好处是,我们构建的react程序可以应用在不同的设备中,不仅浏览器。

类似于 angular 的 BrowserModule

import { BrowserModule } from '@angular/platform-browser';

向 DOM 元素添加属性

React.creactElement() 第二个参数就是向dom元素添加dom属性,记住不是html属性,比如 DOM 有className属性,html有 class 属性,这两个不要混淆。

const element = React.createElement('div', {
    className: 'success'
}, 'hello world')
render html

虚拟 DOM 的本质

本质是不创建真正的 DOM 元素,而只是描述真正 DOM 节点的对象,所以在调用 React.createElement() 时,并没有在 DOM 中创建任何东西,只有在执行 render 后,浏览器才会创建真正的 DOM 元素。

React 嵌套 - 子组件

绝大部分的应用都是父组件嵌套子组件,结构更加清晰合理,也方便复用UI。
进一步:

const element = React.createElement('div', {
  className: 'success'
}, React.createElement('strong', null, 'hello world'))

多个呢:

const element = React.createElement('ul', {
    className: 'list'
  }, React.createElement('li', null, 'Johnson'),
  React.createElement('li', null, 'Will'),
  React.createElement('li', null, 'Tammy'))

进一步:

const peoples = [{
    'name': 'Johnson'
    'name': 'Will'
    'name': 'Tammy'
const element = React.createElement('ul', {
  className: 'list'
}, peoples.map(people => (
    React.createElement('li', null, people.name)

需要注意的是,在渲染数组的时候,如果没有设置key唯一键值,React 会给出警告。key的作用主要是可以跟踪哪些子元素发生了变更,在发生变更的时候,只渲染该子组件,提升渲染性能。

React warning
const element = React.createElement('ul', {
  className: 'list'
}, peoples.map((people, index) => (
  React.createElement('li', {
    key: index
  }, people.name)

React JSX

我们学习了如何创建和嵌套元素,仅仅使用嵌套的方法来创建UI那将会是很麻烦的事情。如何更加自然的描述元素间的嵌套关系?重点来了。

JSX 是 JavaScript 的语法扩展,它可以让我们编写起来有点像 HTML 的 JavaScript 代码。

进化:

// const element = React.createElement('ul', {
//   className: 'list'
// }, peoples.map((people, index) => (
//   React.createElement('li', {
//     key: index
//   }, people.name)
// )))
const element = <ol> {
    peoples.map(people => ( 
    <li key={people.name}>{people.name} </li>
  } </ol>

最后底层编译时还是使用 React.creatElement()去创建,但是 JSX 简洁也优雅。

注意:JSX 只返回一个根元素,但是可以包含任何数量的子元素:

const message = (
    <h1>WHO</h1>
      <li>Johnson</li>
      <li>30</li>
      <li>web front-end</li>

React 组件

使用 React 构建程序是为了更好的组件化开发,更好的复用组件,将为简化 UI 构建的过程,在 React 组件类中,只有一个方法是必须的:render()

React 提供了一个基础组件类,用它来组合不同的元素,并将它视为一个元素来使用,可以将 React 组件视为创建 React 元素的工厂,通过构建自定义的组件或类,可以生成自定义的元素。

创建一个新的类,并 extends React.Component,render()的方法返回 JSX 或者该组件渲染的元素。

import React from 'react';
import ReactDOM from 'react-dom';
class ContactList extends React.Component {
  render() {
    const peoples = [{
    'name': 'Johnson'
    'name': 'Will'
    'name': 'Tammy'
 return <ol> {
    peoples.map(people => ( 
    <li key={people.name}>{people.name} </li>
  } </ol>