30-React JSX IN DEPTH

时间:2022-10-28 22:28:00

JSX IN DEPTH


JSX

从根本上说,JSX只是提供了语法糖React.createElement(component, props, ...children)的功能。以下JSX代码:

<MyButton color="blue" shadowSize={2}> Click Me </MyButton>
被编译为:
React.createElement( MyButton, {color: 'blue', shadowSize: 2}, 'Click Me' )
您还可以使用标签的自闭形式,如果没有孩子,例如:
<div className="sidebar" />
编译为:
React.createElement(
'div',
{className: 'sidebar'},
null )

指定React元素类型

一个JSX标签的第一部分确定了React元素的类型。

大写类型表明JSX标签是一个React组件。这些标签会被编译成可以直接引用的命名变量,因此,如果您使用JSX 表达式,Foo必须是在范围内。

React必须在范围内

由于JSX编译时调用React.createElement,因此该React库必须始终在JSX代码范围内。例如:下面两个import都是必须的在代码里,尽管React 和CustomButton不直接从JavaScript中引用。

import React from 'react';
import CustomButton from './CustomButton';
function WarningButton() {
// return React.createElement(CustomButton, {color: 'red'}, null);
return <CustomButton color="red" />;
}

使用点符号的JSX类型

你可以使用点表示法引用内部的JSX组件。对于如果你有一个单一的模块需要导出很多React组件非常的方便。例如:

import React from 'react';
const MyComponents = {
DatePicker: function DatePicker(props) {
return <div>Imagine a {props.color} datepicker here.</div>;
} }
function BlueDatePicker() {
return <MyComponents.DatePicker color="blue" />; }

用户定义的组件必须大写

  • 当一个元素类型以小写字母开头,它引用的是一个内置组件就像
    或并且最终作为一个字符串'div'或'span'传递给React.createElement。
  • 定义,或者从文件中导入到JavaScript的组件,一个大写字母开头的类型例如将会被编译成React.createElement(Foo)。
  • 定义的组件应该以大写字母开头。如果您有以小写字母开头的组件,在JSX使用之前将其分配给一个大写的变量。否则将会报错
  • 运行时类型选择

    你不能使用一般的表达式作为React元素类型。。如果你想使用一般表达式来表示React元素的类型,只需要把它分配给一个首字母大写的变量。例如:

    import React from 'react';
    import { PhotoStory, VideoStory } from './stories';
    const components = { photo: PhotoStory, video: VideoStory }; function Story(props) {
    // Wrong! JSX type can't be an expression. return <components[props.storyType] story={props.story} />;
    } //解决方式:
    import React from 'react';
    import { PhotoStory, VideoStory } from './stories';
    const components = { photo: PhotoStory, video: VideoStory }; function Story(props) {
    // Correct! JSX type can be a capitalized variable.
    const SpecificStory = components[props.storyType];
    return <SpecificStory story={props.story} />;
    }

    JSX中的属性

    1. JavaScript表达式 

      你可以通过任何JavaScript表达式作为属性,用{}包裹。例如:
    <MyComponent foo={1 + 2 + 3 + 4} />

    2.字符串字面量

    你可以传递一个字符串作为属性。例如:

    <MyComponent message="hello world" />
    <MyComponent message={'hello world'} />
    1. Props 默认值为 "True"

      如果你没有传递值给一个属性,它默认为true。以下两个JSX表达式 是相同的: (不建议使用)
    <MyTextBox  autocomplete />
    <MyTextBox autocomplete={true} />

    4.展开属性

    如果你已经有了props一个对象,并希望将它传递给JSX,你可以用...一个“spread” 操作符来传递整个属性对象。以下两种组件时等效的:

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

    Children in JSX

    在同时包含一个开口标记和结束标记的JSX表达式,这些标签之间的内容传递作为一种特殊的属性:props.children。有几种不同的方式来传递的孩子:

    1.字符串字面量 例如:

    Hello world!

    JSX会去掉的开头和结尾的空格,字符串中间的换行将会被压缩成一个空格。所以以下代码都是相同的:

    		<div>Hello World</div>
    <div>
    Hello World
    </div>
    <div>
    Hello
    World
    </div>
    1. JSX Children:

      你可以提供更多的JSX元素作为孩子,这对于嵌套组件来说很有用。例如:
    <MyContainer>
    <MyFirstComponent />
    <MySecondComponent />
    </MyContainer>
    1. JavaScript表达式:

      你可以传递任何JavaScript表达式作为孩子,用大括号({}

      )括起来。例如,这些表达式是等效的:
    <MyComponent>foo</MyComponent> <MyComponent>{'foo'}</MyComponent>
    1. Functions as Children

      传递到自定义组件的孩子可以是任何东西,只要该组件将它们转换为React渲染之前可以理解。这种用法是不常见的,但如果你想扩展JSX能力的话很有效。
    2. Booleans, Null, and Undefined 会被忽略 

      false,null,undefined,和true这类的儿童。React不会区域渲染。以下这些JSX表达式将全部呈现到同样的事情:
    <div />
    <div></div>
    <div>{false}</div>
    <div>{null}</div>
    <div>{true}</div>

    6.这些作为条件渲染会很有用,例如当showHeader是true的时候呈现一个

    <div>
    {showHeader && <Header />}
    <Content />
    </div>
    如果你想有一个类似的值false,true,null,或undefined出现在输出中,你必须将它们转换成字符串。例如:
    <div>
    My JavaScript variable is {String(myVariable)}.
    </div>

30-React JSX IN DEPTH的更多相关文章

  1. React JSX语法说明

    原文:http://my.oschina.net/leogao0816/blog/379487 什么是JSX? 在用React写组件的时候,通常会用到JSX语法,粗看上去,像是在Javascript代 ...

  2. React&lpar;JSX语法&rpar;-----JSX基本语法

    JSX------HTML tags vs React Components: 1.To render a html tag,just use lower-case tag names in JSX; ...

  3. 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品

    http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...

  4. 在react jsx中,为什么使用箭头函数和bind容易出现问题

    在之前的文章中,已经说明如何避免在react jsx中使用箭头函数和bind(https://medium.freecodecamp.o... 但是没有提供一个清晰的demo展示为什么要这样做. 现在 ...

  5. 在react jsx中使用if判断

    在react jsx中如果使用if判断,需要这样做 var loginButton; if (loggedIn) { loginButton = <LogoutButton />; } e ...

  6. Airbnb React&sol;JSX 编码规范

    Airbnb React/JSX 编码规范 算是最合理的React/JSX编码规范之一了 内容目录 基本规范 Class vs React.createClass vs stateless 命名 声明 ...

  7. React useEffect in depth

    React useEffect in depth useEffect class DogInfo extends React.Component { controller = null state = ...

  8. React Hooks in depth

    React Hooks in depth React Hooks https://reactjs.org/docs/hooks-rules.html https://www.npmjs.com/pac ...

  9. 学习 React&lpar;jsx语法&rpar; &plus; es2015 &plus; babel &plus; webpack

    视频学习地址: http://www.jtthink.com/course/play/575 官方地址 https://facebook.github.io/react/ 神坑: 1.每次this.s ...

随机推荐

  1. 简单几何&lpar;线段相交&plus;最短路&rpar; POJ 1556 The Doors

    题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...

  2. 如何解包,编辑,重新打包boot images

    HOWTO: Unpack, Edit, and Repack Boot Images http://forum.xda-developers.com/showthread.php?t=443994 ...

  3. asp&period;net常用函数

    ASP.NET网络编程中常用到的27个函数集 Abs(number) 取得数值的绝对值.   Asc(String) 取得字符串表达式的第一个字符ASCII 码.   Atn(number) 取得一个 ...

  4. 2014年CCNU-ACM暑期集训总结

    2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...

  5. Java中String的split&lpar;&rpar;方法的一些需要注意的地方

    public String[] split(String regex, int limit) split函数是用于使用特定的切割符(regex)来分隔字符串成一个字符串数组,这里我就不讨论第二个参数( ...

  6. Java之戳中痛点 - (7)善用Java整型缓存池

    先看一段代码: package com.test; import java.util.Scanner; public class IntegerCache { public static void m ...

  7. Windows Server 2016-MS服务器应用程序兼容性列表

    该表罗列支持 Window Server 2016 上安装和功能的 Microsoft 服务器应用程序. 此信息用于快速参考,不用于替代有关单个产品的规格.要求.公告或每个服务器应用程序的常规通信的说 ...

  8. Shiro与Spring整合

    Shiro引入Spring 添加jar包/maven配置 <!-- shiro支持 --> <dependency> <groupId>org.apache.shi ...

  9. 渐进式迭代教学法--PHP

    渐进式迭代教学法--PHP 目前常见的课程体系大致情况如下: 阶段1:前端基础(html+css+js) 阶段2:PHP&MySQL基础 + 框架 (PHP基本语法,面向对象,mvc,sql基 ...

  10. 学习Android过程中遇到的问题及解决方法——AS为xutils添加依赖

    在使用xutils时遇到不能添加以来的问题,花了很长时间终于解决,网上添加依赖的方法很多,在此针对个人出现的问题作下笔记. 我本想使用jar包,因为在使用smartImageView时是用的jar包来 ...