React JSX深入浅出理解

 更新时间:2022年12月30日 08:40:32   作者:码农小菲  
React使用JSX来替代常规的JavaScript。JSX是一个看起来很像 XML的JavaScript语法扩展。我们不需要一定使用 JSX,但它有以下优点:JSX执行更快,因为它在编译为JavaScript代码后进行了优化。它是类型安全的,在编译过程中就能发现错误。使用JSX编写模板更加简单快速

概述 

  • jsx 本质是React.createElement(component, props, …children)的语法糖
  • component 指定 React 元素的类型
  • React 必须在作用域内
  • 在 JSX 类型中可以使用点语法
  • 不能将通用表达式作为 React 元素类型
  • js表达式可以作为props传递给 jsx
  • Props 默认值为 “True”
  • 布尔类型、Null 以及 Undefined 不会被渲染

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'}
		)

指定 React 元素类型

JSX 标签的第一部分指定了 React 元素的类型,大写字母开头的 JSX 标签意味着它们是 React 组件

React 必须在作用域内

由于 JSX 会编译为 React.createElement 调用形式,所以 React 库也必须包含在 JSX 代码作用域内

 //在如下代码中,虽然 React 和 CustomButton 并没有被直接使用,但还是需要导入:
   import React from 'react';
   import CustomButton from './CustomButton';
   function WarningButton() {
     // return React.createElement(CustomButton, {color: 'red'}, null);
     return <CustomButton color="red" />;
   }

在 JSX 类型中使用点语法

  • 以使用点语法来引用一个 React 组件
  • 你在一个模块中导出许多 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" />   
  }

用户定义的组件必须以大写字母开头

以小写字母开头的元素代表一个 HTML 内置组件

如 div 标签 会编译为 React.createElement(div)

大写字母开头的元素则对应着在 JavaScript 引入或自定义的组件

如 Foo 标签 会编译为 React.createElement(Foo)

 import React from 'react';
// 正确!组件需要以大写字母开头:
function Hello(props) {
  // 正确! 这种 <div> 的使用是合法的,因为 div 是一个有效的 HTML 标签:
  return <div>Hello {props.toWhat}</div>;
}
function HelloWorld() {
  // 正确!React 知道 <Hello /> 是一个组件,因为它是大写字母开头的:
  return <Hello toWhat="World" />;
}

在运行时选择类型

不能将通用表达式作为 React 元素类型,如果想通过通用表达式来动态决定元素类型,需要首先将它赋值给大写字母开头的变量。

import React from 'react';
import { PhotoStory, VideoStory } from './stories';
   const components = {
     photo: PhotoStory,
     video: VideoStory
   };
   //错误写法:
   function Story(props) {
     // 错误!JSX 类型不能是一个表达式。
     return <components[props.storyType] story={props.story} />;
   }
  //正确写法:
  function Story(props) {
     // 正确!JSX 类型可以是大写字母开头的变量。
     const SpecificStory = components[props.storyType];
     return <SpecificStory story={props.story} />;
 }

JavaScript 表达式作为 Props

可以把包裹在 {} 中的 JavaScript 表达式作为一个 prop 传递给 JSX 元素

 <MyComponent foo={1 + 2 + 3 + 4} />

if 语句以及 for 循环不是 JavaScript 表达式,所以不能在 JSX 中直接使用,但可以用在 JSX 以外的代码中

function NumberDescriber(props) {
   let description;
   if (props.number % 2 == 0) {
     description = <strong>even</strong>;
   } else {
     description = <i>odd</i>;
   }
   return <div>{props.number} is an {description} number</div>;
 }

字符串字面量

可以将字符串字面量赋值给 prop

//等价
<MyComponent message="hello world" />
<MyComponent message={'hello world'} />

将字符串字面量赋值给 prop 时,它的值是未转义的

//等价
 <MyComponent message="&lt;3" />
<MyComponent message={'<3'} />

Props 默认值为 “True” 如果没给 prop 赋值,它的默认值是 true

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

展开属性

可以使用展开运算符 … 来在 JSX 中传递整个 props 对象

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

JSX子元素

字符串字面量

<MyComponent>Hello world!</MyComponent>

子元素允许由多个 JSX 元素组成

 <MyContainer>
   <MyFirstComponent />
   <MySecondComponent />
 </MyContainer>

JavaScript 表达式作为子元素,使用 {} 包裹

//等价
<MyComponent>foo</MyComponent>
<MyComponent>{'foo'}</MyComponent>
function Item(props) {
 return <li>{props.message}</li>;
}
function TodoList() {
 const todos = ['finish doc', 'submit pr', 'nag dan to review'];
 return (
   <ul>
     {todos.map((message) => <Item key={message} message={message} />)}
   </ul>
 );
}

函数作为子元素

 // 调用子元素回调 numTimes 次,来重复生成组件
function Repeat(props) {
 let items = [];
 for (let i = 0; i < props.numTimes; i++) {
   items.push(props.children(i));
 }
 return <div>{items}</div>;
}
function ListOfTenThings() {
 return (
   <Repeat numTimes={10}>
     {(index) => <div key={index}>This is item {index} in the list</div>}
   </Repeat>
 );
}
//可以将任何东西作为子元素传递给自定义组件,只要确保在该组件渲染之前能够被转换成 React 理解的对象。这种用法并不常见,但可以用于扩展 JSX。

布尔类型、Null 以及 Undefined 将会忽略,不会被渲染。如果你想渲染 false、true、null、undefined 等值,需要先将它们转换为字符串:

<div>
   My JavaScript variable is {String(myVariable)}.
 </div>

到此这篇关于React JSX深入浅出理解的文章就介绍到这了,更多相关React JSX内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ReactNative-JS 调用原生方法实例代码

    ReactNative-JS 调用原生方法实例代码

    这篇文章主要介绍了ReactNative-JS 调用原生方法实例代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • react以create-react-app为基础创建项目

    react以create-react-app为基础创建项目

    这篇文章主要介绍了react以create-react-app为基础创建项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • React Context详解使用方法

    React Context详解使用方法

    Context提供了一个无需为每层组件手动添加props,就能在组件树间进行数据传递的方法。在一个典型的 React 应用中,数据是通过props属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的
    2022-12-12
  • React Native 使用Fetch发送网络请求的示例代码

    React Native 使用Fetch发送网络请求的示例代码

    本篇文章主要介绍了React Native 使用Fetch发送网络请求的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • React深入了解原理

    React深入了解原理

    React是用于构建用户界面的JavaScript库, [1]  起源于Facebook的内部项目,该公司对市场上所有 JavaScript MVC框架都不满意,决定自行开发一套,用于架设Instagram的网站
    2022-07-07
  • 关于react-router中的Prompt组件使用心得

    关于react-router中的Prompt组件使用心得

    这篇文章主要介绍了关于react-router中的Prompt组件学习心得,Prompt组件作用是,在用户准备离开该页面时, 弹出提示, 返回true或者false, 如果为true, 则离开页面, 如果为false, 则停留在该页面,本文结合示例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 在React中应用SOLID原则的方法

    在React中应用SOLID原则的方法

    SOLID 是一套原则,它们主要是关心代码质量和可维护性的软件专业人员的指导方针,本文给大家分享如何在React中应用SOLID原则,感兴趣的朋友一起看看吧
    2022-07-07
  • React 在非组件环境切换路由的方法

    React 在非组件环境切换路由的方法

    这篇文章主要介绍了React 在非组件环境切换路由的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • React超详细讲述Fiber的使用

    React超详细讲述Fiber的使用

    在fiber出现之前,react的架构体系只有协调器reconciler和渲染器render。当前有新的update时,react会递归所有的vdom节点,如果dom节点过多,会导致其他事件影响滞后,造成卡顿。即之前的react版本无法中断工作过程,一旦递归开始无法停留下来
    2023-02-02
  • 一文掌握React 组件树遍历技巧

    一文掌握React 组件树遍历技巧

    这篇文章主要为大家介绍了React 组件树遍历技巧的掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论