Skip to content

基础语法

目录

初步认识

React 应用程序是由组件组成的,React 组件是返回标签的 JavaScript 函数:

react
function MyButton() {
  return <button>我是一个按钮</button>;
}

然后就可以将组件嵌套到另一个组件中。并且React 组件必须以大写字母开头,而 HTML 标签则必须是小写字母。

react
export default function MyApp() {
  return (
    <div>
      <h1>欢迎来到我的应用</h1>
      <MyButton />
    </div>
  );
}

JSX

以上的标签语法被称为JSX,是js语法的扩展。语法上增加类型为tsx。

使用规则:

  • 必须闭合标签
  • 不能返回多个JSX标签,包裹到一个共享的父级
  • 可以使用空的<>...</>包裹
react
function AboutPage() {
  return (
    <>
      <h1>关于</h1>
      <p>
        你好。
        <br />
        最近怎么样?
      </p>
    </>
  );
}

参考资料:

JSX 最早由React 团队在 2013 年推出,作为 React 框架的核心特性之一。其设计初衷是为了解决直接使用React.createElement函数创建虚拟 DOM 时代码冗长、可读性差的问题。

受 XML/HTML 启发,但本质是 JavaScript 扩展

  • JSX 的语法形式借鉴了XML/HTML 的标签结构,允许开发者在 JavaScript 中直接编写类似 HTML 的代码。然而,其本质是 JavaScript 的语法扩展,需通过编译器(如 Babel)转换为浏览器兼容的 JavaScript,并处理高版本语法降级,使其能在不同环境中运行
  • 例如,JSX 中的标签会被转换为React.createElement函数调用(React 17 后改为_jsx函数),最终生成描述 UI 的 JavaScript 对象(即 React 元素)
  • JSX 被广泛视为一种语法糖,其目的是简化 UI 的声明式编写,提升代码可读性和开发效率。例如,它允许在标签中直接嵌入 JavaScript 表达式(通过{}),动态生成内容。
  • 对比模板语法(如 Vue 的模板),JSX 的优势在于完全利用 JavaScript 的编程能力,例如条件渲染、循环和函数调用,而无需学习额外的 DSL(领域特定语言)

TSX

1.tsx如何使用泛型

正常写泛型语法会跟tsx语法冲突,他会把泛型理解成是一个元素,解决方案后面加一个,即可

typescript
function App() {
  const value: string = '小满'
  const clickTap = <T,>(params: T) => console.log(params)
  return (
    <>
      <div onClick={() => clickTap(value)}>{value}</div>
    </>
  )
}

2.tsx如何渲染html代码片段

dangerouslySetInnerHTML 的值是一个对象,该对象包含一个名为 __html 的属性,且值为你想要插入的 HTML 字符串

javascript
function App() {
  const value: string = '<section style="color:red">小满</section>'
  return (
    <>
        <div dangerouslySetInnerHTML={{ __html: value }}></div>
    </>
  )
}

3.tsx如何遍历dom元素

使用map遍历返回html标签即可。map可以返回新的数组。foreach不合适,没有返回值。

typescript
function App() {
  const arr: string[] = ["小满","中满","大满"]
  return (
    <>
        {
            arr.map((item) => {
                return <div>{item}</div>
            })
        }
    </>
  )
}

4.tsx如何编写条件语句

使用三元表达式就可以了

javascript
const flag:boolean = true
return (
<>
{
flag ? <div>真的</div> : <div>假的</div>
}
</>
)
}
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq1195566313/article/details/141966390"
function App() {
  const flag:boolean = true
  return (
    <>
        {
           flag ? <div>真的</div> : <div>假的</div>
        }
    </>
  )
}

5.tsx注意事项

{}插值语句内不允许编写**switch``if``变量声明或者直接放入对象本体**

javascript
//错误用法
function App() {
  const obj = { name: '小满' }
  return (
    <>
      {obj}
    </>
  )
}
//正确用法
function App() {
  const obj = { name: '小满' }
  return (
    <>
      {obj.name}
      {JSON.stringify(obj)}
    </>
  )
}
javascript
//错误用法
function App() {
  const flag:boolean = true
  return (
    <>
       {
        if(flag){
          <p>1</p>
        }else{
          <p>2</p>
        }
       }
    </>
  )
}
//正确用法
function App() {
  const flag:boolean = true
  return (
    <>
       {
        flag ? <div>1</div> : <div>2</div>
       }
    </>
  )
}

添加样式

在 React 中,使用className来指定一个 CSS 的 class。与 HTML 的class属性的工作方式相同:

react
<img className="avatar"/>

绑定多个class(className)

typescript
function App() {
  const a:string = 'A'
  return (
    <>
      <div className={`${a} class2`}>{value}</div>
    </>
  )
}

绑定样式style

javascript
  const styles = { color: 'red' }
  return (
    <>
      <div style={styles}>test</div>
    </>
  )
}"
function App() {
  const styles = { color: 'red' }
  return (
    <>
      <div style={styles}>test</div>
    </>
  )
}

显示数据

使用{}在标签中嵌套变量。

1.插值语句:{},展示字符串、数字、数组(普通类型,里面是对象不行)、或者Dom元素,直接展示布尔值不行,一般用于布尔值。支持Api调用

2.直接展示对象需要序列化

3.绑定属性也使用{},class比较特殊,使用className,多个class使用模板语法

4.绑定style是一个对象

react
const user = {
  name: 'Hedy Lamarr',
  imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
  imageSize: 90,
};
export default function Profile() {
  return (
    <>
      <h1>{user.name}</h1>
      <img
        className="avatar"
        src={user.imageUrl}
        alt={'Photo of ' + user.name}
        style={{
          width: user.imageSize,
          height: user.imageSize
        }}
      />
    </>
  );
}

关于style=并不是一个特殊的语法。

外层{}是 JavaScript 表达式,JSX 中所有 JavaScript 表达式都需要用{}包裹。告诉react这里需要执行 JavaScript 代码。

内层的大括号表示一个JavaScript 对象,用于描述样式规则。React 的行内样式强制要求传入JavaScript 对象,不能传入html中传统的字符串,这样避免重复解析 CSS 字符串,对象结构更易被 JavaScript 引擎优化。

5.添加html代码片段

条件渲染

根据条件渲染组件。

方法一:条件判断后赋值引入组件。

javascript
let content;
if (isLoggedIn) {
  content = <AdminPanel />;
} else {
  content = <LoginForm />;
}
return (
  <div>
    {content}
  </div>
);

方法二:在jsx内部判断使用,更为简洁

react
<div>
  {isLoggedIn ? (
    <AdminPanel />
  ) : (
    <LoginForm />
  )}
</div>
//或者
<div>
  {isLoggedIn && <AdminPanel />}
</div>

列表渲染

依赖 JavaScript 的特性,例如for循环array 的map()函数来渲染组件列表。

<li>有一个key属性。对于列表中的每一个元素,应该传递一个字符串或者数字给key,用于在其兄弟节点中唯一标识该元素。

typescript
const products = [
  { title: '卷心菜', isFruit: false, id: 1 },
  { title: '大蒜', isFruit: false, id: 2 },
  { title: '苹果', isFruit: true, id: 3 },
];

export default function ShoppingList() {
  const listItems = products.map(product => (
    <li
      key={product.id}
      style={{
        color: product.isFruit ? 'magenta' : 'darkgreen'
      }}
    >
      {product.title}
    </li>
  ));

  return (
    <ul>{listItems}</ul>
  );
}

响应事件

给组件绑定响应事件。

1.使用驼峰onClick,传参需要高阶函数。

react
//声明事件函数
function MyButton() {
  function handleClick() {
    alert('You clicked me!');
  }

  return (
  //绑定事件
    <button onClick={handleClick}>
      点我
    </button>
  );
}

2.如果需要使用泛型函数,需要纠正泛型<T>为<T,>,以防被理解为一个元素标签。

typescript
 function handleClick<T,>(params:T) {
    alert(params);
  }

更新界面

使用useState 声明state 变量,用于存储信息展示并更新。

按照惯例使用数组解构来命名状态变量,例如[something, setSomething]

如果多次渲染同一个组件,每个组件都会拥有自己的 state。

react
import { useState } from 'react';

function MyButton() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <button onClick={handleClick}>
      Clicked {count} times
    </button>
  );
}

export default function MyApp() {
  return (
    <div>
      <h1>独立更新的计数器</h1>
      <MyButton />
      <MyButton />
    </div>
  );
}

每个按钮会 “记住” 自己的count,而不影响其他按钮。

Hook

use开头的函数被称为HookuseState是 React 提供的一个内置 Hook。Hook 比普通函数更为严格。只能在组件(或其他 Hook)的顶层调用 Hook。如果想在一个条件或循环中使用useState,需要提取一个新的组件并在组件内部使用它。

组件间共享数据

prop

MyApp中声明数据和事件 ,通过prop将数据和事件传递给子组件,实现共同修改一个数据

typescript
import { useState } from 'react';

export default function MyApp() {
  const [count, setCount] = useState(0);

  function handleClick() {
    setCount(count + 1);
  }

  return (
    <div>
      <h1>共同更新的计数器</h1>
      <MyButton count={count} onClick={handleClick} />
      <MyButton count={count} onClick={handleClick} />
    </div>
  );
}

function MyButton({ count, onClick }) {
  return (
    <button onClick={onClick}>
      点了 {count} 
    </button>
  );
}

//绑定样式style

基于 Obsidian + VitePress 构建