React入门第一篇

忽然想回来炫一口前端,浅浅学一下react(本来想速成的,既然在寒假就慢慢学吧)

项目搭建

这里直接介绍用脚手架来进行项目搭建(这里默认大家node.js配置好了喵)

1. Vite搭建

 npm create vite@latest my-app -- --template react
 cd my-app
 npm run dev

2. CRA 搭建

 npx create-react-app my-app
 cd my-app
 npm start

初始化开发环境

1.安装依赖

  • ESLint + Prettier + Husky + Lint-staged(代码规范与自动化)
  • Tailwind CSS(或其他 UI 库)
 npm install react-router-dom zustand axios classnames

目录:

 ├── public/             # 静态资源
 ├── src/
 │   ├── assets/         # 图片、字体等资源
 │   ├── components/     # 可复用组件
 │   ├── pages/         # 页面级组件
 │   ├── hooks/         # 自定义 hook
 │   ├── stores/         # 状态管理
 │   ├── utils/         # 工具函数
 │   ├── App.tsx         # 根组件
 │   └── main.tsx       # 入口文件
 ├── .eslintrc           # ESLint 配置
 ├── .prettierrc         # Prettier 配置
 └── package.json

项目运行

 npm run dev //vite
 npm start // CRA

JSX

基本介绍

我们可以看到这里,源码中实现了js和html的融合,这种语法叫做JSX,这种语法就类似于一种模板语法,与vue的模板语法相比呢,JSX将HTML和JS结合的更加深入。

image-20251204162235400

这里我们可以看到HTML是写在return的返回值中的,因为的下面的返回值包含了多行内容,这里的小括号()是JSX语法中必须的。

我们还可以看到这里在HTML中最外层加入了有一个空标签,这个是因为JSX语法中,JSX只能有一个根元素,如果一定需要多个根元素则需要在外面加上一个元素包裹,但这样可能会导致许多的样式问题,所以引入了空标签,用空标签进行包裹,但是在渲染的时候不会渲染空标签,也不会影响原本的页面结构。

基本语法

JS表达式识别

在JSX中用大括号语法识别JS中的表达式,比如变量函数调用,方法调用等等,比如说下面的代码,

 function App() {
   const title = "我的第一个 JSX 组件";
   const items = ["苹果", "香蕉", "橙子"];
 ​
   return (
     <div>
       <h1>{title}</h1>
       <ul>
        {items.map((item, index) => (
           <li key={index}>{item}</li>
        ))}
       </ul>
       <button onClick={() => alert("点击了!")}>
        点我
       </button>
     </div>
  )
 }
 ​
 export default App
 ​

列表渲染

用原生JS中的map方法去渲染遍历列表。

 function App() {
   const list = [
    {id : 1001,name:'vue'},
    {id : 1002,name:'react'},
  ]
 ​
   return (
     <div>
       <ul>
        {list.map(item => <li key={item.id}>{item.name}</li>)}
       </ul>
     </div>
  )
 }
 ​
 export default App

这里需要一个key绑定,是react框架为了提升渲染性能而用到的一个值

条件渲染

在react中使用逻辑与运算符&&,三元表达式实现基本的条件渲染

 function App() {
   const flag = true
   return (
     <>
    {flag && <div>this is ttdr</div>}
    {flag ? <div>Dalta Force</div> : <div>Railway Star</div>}
     </>
  )
 }
 ​
 export default App

复杂情况下的条件渲染

 const userType = "admin"
 function getUserType(){
   if (userType ==="admin"){
     return <div>我是管理员</div>
  }else if(userType === "client") {
     return <div> 我是顾客</div>
  }else{
     return <div>我啥也不是</div>
  }
 }
 function App() {
   return (
     <>
     <div>{getUserType()}</div>
     </>
  )
 }
 ​
 export default App
 ​

基础事件绑定

语法:on事件名称 = {事件处理程序}

注意驼峰命名喵

 function App() {
   const clickHandler = () =>{
     console.log("点击")
  }
   return (
     <button onClick={clickHandler}>click</button>
  );
 }
 ​
 export default App
 ​

使用事件对象参数就只需要增加一个形参e

   const clickHandler = (e) =>{
     console.log("点击")
  }

如果是传递自定义参数就在相应的位置增加相应的参数但是后面调用需要改为箭头函数的形式

 function App() {
   const clickName = (name) =>{
     console.log("点击",name)
  }
   return (
     <button onClick={() => clickName('ttdr')}>name</button>
  );
 }
 ​
 export default App
 ​

注意这里不能直接写成函数引用

如果既要对象事件参数,又要自定义函数,我们就可以把两个融合一下

 function App() {
   const clickName = (name,e) =>{
     console.log("点击",name,e)
  }
   return (
     <button onClick={(e) => clickName('ttdr')}>name</button>
  );
 }
 ​
 export default App
 ​

组件

组件是一个通用的概念,目前的主流前端开发中都是采用的一个组件化开发模式。

组件就是界面的一个部分,有自己的逻辑和外观,组件之间可以互相嵌套,也可以复用多次。

基础语法

在React中,组件就是一个首字母大写的函数,内部存放了组件的逻辑和视图UI,渲染组件只需要把组件当成标签书写即可。

 function Button(){
   return <button>click!</button>
 }
 function App() {
   return (
     <Button/>
  );
 }
 ​
 export default App
 ​

当然我们也可以写箭头函数

 const Button = () =>{
   return <button>click!</button>
 }

useState

useState是一个React Hook(函数),允许我们向组件增加一个状态变量,从而控制影响组件的渲染结果。

与普通JS遍历不同的是,状态变量一旦变化,组件的UI也会跟着变化(数据驱动视图)。

基础语法

 import { useState } from 'react'
 ​
 function App() {
       const [count,setCount] = useState(0)
   const handleClick = () =>{
     setCount(count + 1)
  }
   return (
     <botton onClick={handleClick} >{count}</botton>
  );
 }
 ​
 export default App
 ​

我们需要去导入userState,然后调用useState函数,会返回一个状态变量,一个修改状态变量的函数,每次修改状态变量必须调用这个函数。

修改状态变量的规则

状态被认为是只读的,我们应该去替换他而不是修改他,直接修改不能引发视图更新。

也就是说,我们对状态变量的操作不会产生视图更新,我们需要去通过set函数去将新值替换掉原本的值。

修改对象状态

对于对象类型的状态变量,我们要传给set方法一个全新的对象来进行修改。

   const [user,setUser] = useState({
     name:'ttdr'
  })
   const handelName = () =>{
     setUser({
       ...user,
       name: "Ttdr",
    })
  }

我们通过展开运算符,后面跟上需要修改的字段,来实现对一些字段的修改

基础样式控制

基本介绍

1.行内样式控制(不推荐)

 <div style={{color:'red',fontSize:'50px'}}>this is ttdr</div>

我们也可以把样式单独声明出来像这样

   const style = {
     color:'red',
     fontSize:'50px'
  }
   /*做代码演示直接简化了*/
   <div style={style}>this is ttdr</div>

2.class类名控制

react里面定义类名的语法是className而不是class

 import './App.css'
 /*.此处省略.*/
 <div className="foo">Dalta Force</div>

classnames优化类名控制

是一个简单的JS库,方便通过条件动态控制class类名显示。

 className = {classNames('nav-item',{active:type === item.type})}

第一个参数为静态的类名,后面的对象为动态类名,key就是需要控制的类名,value就是要控制类名显示的条件

暂无评论

发送评论 编辑评论


				
上一篇
下一篇