react 深入JSX

本质上来说JSX是React.createElement(component, props, ...children)方法的语法糖。

所以我们如果使用了JSX,我们其实就是在使用React,所以我们就需要引入React

import React from 'react';

然后我们写组件的时候,自定义组件的首字母是大写的,否则表示它是一个内置组件

运行时确定类型时,遇到了一个问题,准确来说跟这个小节的内容不是特别有关,就是让我想起了一个内容,就是我们的react组件一般命名都是大写字母开头的,然后我试了一下这样的操作:

    function Hello() {
        return (
            <h1>Hello</h1>
        )
    }

    function World() {
        return (
            <h1>World</h1>
        )
    }

    const components = {
        hello:Hello,
        world:World
    };

    ReactDOM.render(<components.hello/>,document.getElementById('root'));

这样是可以正确渲染出来的,并不会报错,我觉得很奇怪,因为我们写的是<components.hello/>这样的小写的组件,它为什么不判断为是内置组件呢?我想了一下,也许是因为有.操作符存在,所以React知道它是一个自定义的组件。如果我们换一种写法:

    function Hello() {
        return (
            <h1>Hello</h1>
        )
    }

    function World() {
        return (
            <h1>World</h1>
        )
    }

    const components = {
        hello:Hello,
        world:World
    };
    const hello = components['hello'];

    ReactDOM.render(<hello/>,document.getElementById('root'));

这样写,虽然hello和上面那个例子的components.hello完全是等价的,但是React把它识别为一个普通的组件,导致报错。

不得不说React是非常聪明的。

然后回到这一小节(运行时确定类型),就是说我们不能在元素标签的类型中使用表达式,比如:<components.[this.props.type]>,这么写就是错的,如果我们要实现这种根据参数来改变组件的话,我们需要提前把它赋值给一个大写字母开头的变量,为什么要大写?我们刚说过,如果是小写,那么React就会识别为一个内置组件。最后就是这样:

const SpecificType = components[this.props.type];
return <SpecificType/>

属性的默认值如果我们没有属性赋值,只是写了出来,那么它的默认值是true

<MyTextBox autocomplete/>
<MyTextBox autocomplete={true}/>

这里的{true}不要以为是{true: true}哈,这个{}是在JSX中使用JS的标志。

传递属性
如果我们想要把属性对象(不一定真的是传递进来的,也可以是我们加工之后的)传递其他组件,那我们可以这么写。

function App1() {
  return <Greeting firstName="Ben" lastName="Hector" />;
}

function App2() {
  const props = {firstName: 'Ben', lastName: 'Hector'};
  return <Greeting {...props} />;
}

这样确实是非常方便的,省的我们写那些属性名啦,但是这可能让我们把过多的参数传递给某个组件,所以用的时候最好确保所有参数都是有意义的,不然有可能是代码变得混乱,谨慎使用。

子代
这个就是我们之前用到的,但是没有详细解释的一个地方。在开始标签和结束标签之间就是我们的props.children属性。

如果子代的字符串的话,props.children是移除两端的空格,中间的换行符是一个空格,内部的多个空格也是一个空格(和HTML一样)。

子代当然也可以是组件啦,我们之前就这么用过,当然,也可以是组件和字符串的结合啦,所以基本上子代可以是任何东西。props.children是一个数组按顺序包含所有的子代组件。

突然看到

render() {
  // 不需要使用额外的元素包裹数组中的元素
  return [
    // 不要忘记 key :)
    <li key="A">First item</li>,
    <li key="B">Second item</li>,
    <li key="C">Third item</li>,
  ];
}

包含在数组中的元素渲染出来可以不用元素包裹起来,这个厉害的嘛?我之前一直不知道,不过仔细想想我们之前其实已经用过了,当我们用map把一个数组转换为组件的时候,返回值就是一个数组嘛,我们也没有把它包在一个组件当中,观察还是不仔细呀。

组件还可以是一个函数哦,我们可以把一些组件的"构造函数"传递进去:),当然用法我目前还了解的不多。

在子代中,有几个情况是不渲染的,我们需要了解一下:

<div />

<div></div>

<div>{false}</div>

<div>{null}</div>

<div>{undefined}</div>

<div>{true}</div>

这个规则也是我们能够使用条件渲染的前提,但也有一些特例,我们需要注意一下,就是数字00是一个falsy值,但是有时候我们随意使用的话会出现意料之外的事情,比如

<div>
  {props.messages.length &&
    <MessageList messages={props.messages} />
  }
</div>

我们本来是想当messages数组中没有内容的时候我们就不渲染啦,但是这个表达式props.messages.length && ....的值是0,React肯定不知道我们是输出0呢,还是表示false呢,所以它肯定不能因为0表示false,而不去渲染0,那么我们很多地方其实又需要渲染出0。所以我们尽量保证我们的逻辑表达式的返回值是布尔类型的返回值。
如果我们需要输出false, null,undefined,true,我们需要先把它们转换为字符串类型。

<div>
  My JavaScript variable is {String(myVariable)}.
</div>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,820评论 0 24
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,232评论 2 21
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,833评论 1 18
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,061评论 2 35
  • 学习如何在Flow中使用React 将Flow类型添加到React组件后,Flow将静态地确保你按照组件被设计的方...
    vincent_z阅读 6,349评论 4 21