Evan Zou

Welcome to my blog.

Javascript follower.


Hi, I am Evan, nice to meet you all.

React 片段(fragments)详解

一. 动机

以下的例子简洁清晰的反映了 fragments 的作用,在生产过程中,经常会遇到这种情况: 首先,是在 Table 组件中插入 Columns 组件:

class Table extends React.Component {
    render() {
        return (
        <table>
            <tr>
                <Columns />
            </tr>
        </table>
        );
    }
}

因为 React 组件最外层需要一个元素包裹,如果这时使用div标签包裹,那么最终生成的 HTML 将是无效的。

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

这时候Fragment就派上用场了

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

这时候,Table 组件就能被正确渲染如下:

<table>
  <tr>
    <td>Hello</td>
    <td>World</td>
  </tr>
</table>
1.2 简写语法

有一个新的,更短的语法可以用来声明片段(fragments)。他看起来像是空标签:

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

您可以像使用其他元素一样使用<></>,只是它不支持 键(keys) 或 属性(attributes)。

注:目前很多工具都不支持这个简写语法,所欲可能需要明确地使用<React.Fragment>,直到工具支持这个语法。

1.3 带 key 的片段(fragments)

<React.Fragment />可以传递 key 值,如下:

function Glossary(props) {
    return (
        <dl>
            {props.items.map(item => (
                <React.Fragment key={item.id}>    
                    <dt>{item.term}</dt>
                    <dd>{item.description}</dd>
                </React.Fragment>
            ))}
        </dl>
    );
}
//没有`key`,将会触发一个 key 警告

注:key是唯一可以传递给Fragment的属性。在将来,可能会增加额外的属性,比如事件处理。

最近的文章

React 表单(Forms)详解

如果希望 React 的表单和 HML 表单的默认行为不一致,需要使用到一种称为“受控组件(Controlled Components)”的技术。受控组件在 HTML 中,表单元素如 input,select 等根据用户输入更新。而在 React 中,可变状态一般保存在组件的 state 属性中,并通过 setState()方法更新。我们可以通过是 React 的 state 成为”单一数据源”来结合这两个形式。然后 React 组件也可以控制在用户输入之后的行为。这种形式,其值由 Rea...…

React继续阅读
更早的文章

React Lifecycle(生命周期)

按照我的理解,生命周期主要分为一下几个步骤: componentWillMount() 在组件第一次渲染之前调用,这个是在 render 方法调用前可修改 state 的最后一次机会。这个方法基本不会用到。 render() 渲染虚拟 dom。 componentDidMount() 在组件第一次渲染后立即调用。一般会在这个方法里执行 ajax,setinterval,settimeout 等方法。因为 ajax 是异步请求,如果在 componentW...…

React继续阅读