React学习之进阶JSX语法十一

1.再顾JSX语法

从我第一篇博客来看,JSX其实就是提供了一个实现React.createElement(component,props,...children)函数的便捷方法

<MyButton color="blue" shadowSize={2}>
  Click Me
</MyButton>

React编译完后就形成了

React.createElement(
  MyButton,{color: 'blue',shadowSize: 2},'Click Me'
)

所以注意,第一个参数不一定是一个DOM参数,只要是一个JSX组件或者是DOM标签。

当然如果你不加入子内容的话

<div className="sidebar" />

直接闭合标签即可

编译后

React.createElement(
  'div',{className: 'sidebar'},null
)

2.不要试图用属性访问符来构造JSX组件

const MyComponents = {
  DatePicker: function DatePicker(props) {
    return <div>Imagine a {props.color} datepicker here.</div>;
  }
}

function BlueDatePicker() {
//Warning : no allowed
  return <MyComponents.DatePicker color="blue" />;
}

这种使用.属性访问符进行构建JSX组件虽然不会报错,但是不允许

3.用户自定义的组件名必须是大写的

function hello(props) {
  return <div>Hello {props.toWhat}</div>;
}

function HelloWorld() {
  return <hello toWhat="World" />;
}

此方法是不会有任何输出的

至于为什么之前的博客也讲过,DOM元素才能用小写,其他的都应该用大写。

如果你已经将一个组件的名字写成了小写,可以将它赋值给一个大写的变量即可

function HelloWorld() {
  const Hello = hello;
  return <Hello toWhat="World" />;
}

4.正确的选择基于同一架构的不同组件

不要试图用表达式来构造JSX组件标签,如下

const components = {
  photo: PhotoStory,video: VideoStory
};

function Story(props) {
  return <components[props.storyType] story={props.story} />;
}

此方法会报错,解决的方案是,将这哥值赋值给一个大写开头的变量即可。

const components = {
  photo: PhotoStory,video: VideoStory
};
function Story(props) {
  // 如果没有此行报错
  const SpecificStory = components[props.storyType];
  return <SpecificStory story={props.story} />;
}

这里还需要注意的是,对于组件的名字是必须不同的,但是可以用相同的变量来处理,因为变量只是承载组件的容器而已,它作用只是为了让React可以将JSX语句变为一个对象。

function Story2(props) {
  return <div>22222222222</div>;
}
function Story(props) {
  return <div>11111111111</div>;
}
let Str = Story2;
ReactDOM.render(
    <Str />,document.getElementById('example') ); Str = Story; ReactDOM.render( <Str />,document.getElementById('example1') );

5.JSXprops的多种运用

【这里介绍的内容有一部分在第一篇博客就讲到了】

javascript表达式

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

字符串字面量

<MyComponent message="hello world" />

<MyComponent message={'hello world'} />

由于字符串处理的时候,React会自动将字符串进行转义处理,所以下面两个语句是等价的。

<MyComponent message="&lt;3" />

<MyComponent message={'<3'} />

属性的默认值

当你设定一个属性但是没有为他设置一个值的话,它的默认值会是 true.

<MyTextBox autocomplete />

<MyTextBox autocomplete={true} />

两者是等价的,当然强烈要求不要这么做,如果有属性一定要赋初始值,因为这有可能和ES6的新对象特性相混淆。

ES6{autocomplete}表示的是{autocomplete : autocomplete}而不是{autocomplete:true},所以请使用第二种方式

6.扩展运算符

如果你有一个对象,想将它完整的传递给JSX作为JSXprops属性对象时,你可以使用...扩展运算符

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

上述的第二个函数式组件的操作就相当于将props赋值给了App2.props属性

扩展运算符是ES6的新特性,它的作用基本和我们for in有点类似,遍历一个对象将它的所有属性都提取出来。

当然在这里的运用,官方建议尽可能少用这种方式给JSX语句对象props属性赋值,因为会造成很多空间浪费,因为你可能有很多属性都不会用到。

7.JSXchildren属性

当我们增加子内容给一个组件时,就相当于将内容增加到这个组件的children属性中,一般有以下几种应用方式。

字符串字面量

我们可以在组件之间增加字符串字面量,当然这个字面量可以是HTML语句,但是需要注意一点的是,这里的字符串字面量是没有被编码的,也就是说,当我们通过大括号进行表达式插入时,默认是进行编码的,而你自己增加的内容是不会被编码的,所以在这里我们可以像在HTML中用标签一样在这里用,比如空格的话我们就需要用&amp;才能真的隔离开字符串

<div>This is valid HTML &amp; JSX at the same time.</div>

这样的原因是,JSX会自动删除空格符,换行符,等等。

<div>Hello World</div> <div> Hello World </div>

<div> Hello World </div> <div> Hello World </div>

上述的四种情况的最终视图呈现结果是一样

JSX作为孩子

JSX语句对象又作为孩子

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

我们可以在组件中混用HTMLJSXReact会自动的处理,区分

javascript表达式

首先可以明确地是任何javascript表达式只要放在大括号中都可以在JSX中使用,毫无障碍,所以放在孩子中是没有一点问题的。

甚至我们可以直接将一个数组输出到我们的JSX

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

函数也是个孩子

可以是匿名函数,也可以是箭头函数

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

8.Booleans,Null,和Undefined是无用的

false,null,undefined,和 true虽然用大括号括起来是一个合法的孩子,但是他们不会被呈现在视图中

<div />

<div></div> <div>{false}</div> <div>{null}</div> <div>{undefined}</div> <div>{true}</div>

这些代码都是等价的。

既然不会显示,那么留着这个有个毛线用,当然是有用的,我们可以通过这些东西来选择性的输出数据给视图显示

<div>
  {showHeader && <Header />} <Content /> </div> 

因为showHeaderfalse的时候不会将这一行的数据显示出来,而为true的时候则会显示<Head />的内容

当然如果是一些特殊的转换判断就得另算了,比如说01他们会被判断为falsetrue,但是会显示出来。

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

这里props.messages.length等于0的话,会显示出一个0,所以我们使用时一定要将它变为一个布尔表达式

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

当然如果你想输出这几个单词的话,对不起了,只能转换为字符串输出

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

下一篇将讲React中的类型检查

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom