React简单相识

打印 上一主题 下一主题

主题 846|帖子 846|积分 2538

原理简化相识 

  1. import React from "react"
  2. import { createRoot } form "react-dom/client"
  3. const element = React.createElement(
  4.     'p',
  5.     {id: 'hello'},
  6.     'Hello World!'
  7. )
  8. const container = document.querySelector('#root')
  9. const root = createRoot(container)
  10. root.render()
复制代码
编写一个自界说的render函数,该函数接受“React元素”和对container的引用:
  1. function render(reactElement, containerDOMElement) {
  2.     // 创建一个DOM对象
  3.     const domElement = document.createElement(reactElement.type)
  4.     // 更新属性
  5.     domElement.innerHTML = reactElement.children;
  6.     for (const key in reactElement.props) {
  7.         const value = reactElement.props[key];
  8.         domElement.setAttribute(key, value);
  9.     }
  10.     // 添加为子节点
  11.     containerDOMElement.appenChild(domElement)
  12. }
  13. const reactElement = {
  14. type: 'a',
  15. props: {
  16. href: 'https://wikipedia.org/',
  17. id: 'some-links',
  18. 'data-num': 20,
  19. },
  20. children: 'Read more on Wikipedia',
  21. };
  22. const containerDOMElement =
  23. document.querySelector('#root');
  24. render(reactElement, containerDOMElement);
复制代码
 expression slots

我们可以使用大括号 ( {} ) 创建expression slots,任何放在大括号之间的内容都将被视为纯 JavaScript,而不是字符串。
JSX 在编译时并不会查抄expression solts是否有效!它只是将内容转发到纯 JS 输出,并不会做任何额外的变乱。
  1. import React from "react"
  2. import { render } from “react-dom”
  3. const shopping_list = ["apple", "banana", "carrot"];
  4. const element = (
  5.     <div>
  6.           Purchase: {shopping_list.length}
  7.     </div>
  8. )
  9. const compliedElement = React.createElement(
  10.     "div",
  11.     {},
  12.     "Purchase: "
  13.     shoppingList.length
  14. )
  15. const root = document.querySelector("#root");
  16. // render(element, root)
  17. render(compliedElement, root);
复制代码
你会发现程序输出没有任何变化!
所以如果你在expression slot中做一些条件判定的语句,它会发生错误,但这错误并不是jsx不允许,而是javascript不允许。
  1. import React from "react"
  2. import { render } from “react-dom”
  3. const shopping_list = ["apple", "banana", "carrot"];
  4. const element = (
  5.     <div>
  6.           Purchase: {if ( shoppingList.length < 5) "Almost done!"}
  7.     </div>
  8. )
  9. const compliedElement = React.createElement(
  10.     "div",
  11.     {},
  12.     "Purchase: "
  13.     if ( shoppingList.length < 5) "Almost done!"
  14. )
  15. const root = document.querySelector("#root");
  16. // render(element, root)
  17. render(compliedElement, root);
复制代码
很显然,我们不能将这种条件判定语句这样放在函数的参数中。
HTML与JSX的区别

JSX 看起来像 HTML,但有一些根本的区别
 关键字的保存

JavaScript 有几十个“关键字”。关键字是具有内置功能的关键字。因为它们已经做了一些变乱,所以我们不能在 JSX 中使用它们。
但有一个题目,就是 HTML 属性有时与 JavaScript 关键字重叠。
  1. const element = (
  2.   <div>
  3.     <label for="name">
  4.       Name:
  5.     </label>
  6.     <input
  7.       id="name"
  8.       class="fun-input"
  9.     />
  10.   </div>
  11. );
复制代码
 如果我们将其编译成 JavaScript,我们会发现我们使用了两个保存字:for,class。
为相识决这个冲突,React 对这两个术语使用了细微的变化:


  •        for改为    htmlFor
  • class更改为className
  1. const element = (
  2.   <div>
  3.     <label htmlFor="name">
  4.       Name:
  5.     </label>
  6.     <input
  7.       id="name"
  8.       className="fun-input"
  9.     />
  10.   </div>
  11. );
复制代码
  区分大小写的属性

  在 JSX 中,我们的属性需要是“camelCase” ,这是有效的html:
  1. <video
  2.   src="/videos/cat-skateboarding.mp4"
  3.   autoplay="true"
  4. >
复制代码
在 JSX 中,我们需要将“autoplay”中的“p”大写,因为“auto”和“play”是不同的词:
  1. const element = (
  2.   <video
  3.     src="/videos/cat-skateboarding.mp4"
  4.     autoPlay={true}
  5.     //  ^ Capital “P”
  6.   />
  7. );
复制代码
style的应用 

html中我们可以这么写:
  1. <article style="filter: var(--shadow-elevation-high)"></article>
复制代码
但在jsx中肯定是不行的,需要如下所示:
  1. <article style={ { filter: "var(--shadow-elevation-high)" } }></article>
复制代码
我们需要往expression slots中传入一个对象。
   还有jsx标签必须闭合、必须小写等等。 
  空格陷阱 

  1. import { createRoot } from 'react-dom/client';
  2. const daysUntilSantaReturns = 123;
  3. const element = (
  4. <div>
  5. <strong>
  6. Days until Santa returns:
  7. </strong>
  8. {daysUntilSantaReturns}
  9. </div>
  10. );
  11. const container = document.querySelector('#root');
  12. const root = createRoot(container);
  13. root.render(element);
复制代码
如上代码表现的会是:returns:123,而不是returns: 123,粗体文本和数字之间没有空格。
为什么会这样呢?
让我们思量一下这个 JSX 如何编译为 JavaScript
  1. const element = React.createElement(
  2.   'div',
  3.   {},
  4.   React.createElement(
  5.     'strong',
  6.     {},
  7.     'Days until Santa returns:'
  8.   ),
  9.   daysUntilSantaReturns
  10. );
复制代码
  请记住, JSX 不会编译为 HTML,它会编译为 JavaScript。当执行该 JavaScript 时,它只会创建并附加两个 HTML 节点:
  那么我们该如何解决呢?最常见的解决方案是在大括号中添加单个空白字符:
  1. <div>
  2.   <strong>Days until Santa returns:</strong>
  3.   {' '}
  4.   {daysUntilSantaReturns}
  5. </div>
复制代码
然而在 HTML 中,每个空白字符(以及换行符!)都会产生一个可见的空格。例如,假设我们有 3 个并排的图像(请参见下面的代码游乐场)。默认情况下,HTML 将在它们之间使用单个空白字符来呈现它们。
   当然,它还取决于布局方式。在 Flex布局 中,浏览器将忽略所有空格和缩进,就像 JSX 编译器一样。  
 
          ran      



   

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表