React尝鲜

使用 Vite 尝鲜 React 18 React 18 目前已经开放 alpha 版本可以供我们体验了,那为了更方便快捷的体验 React 18 新特性,今天使用 Vite 搭建一个简易版的 React 开发环境,帮助我们快速尝鲜。 阅读详情

组件

React的组件就是一个js函数,函数内部return一个由jsx语法创建的html代码片段。

//MyComp.js
export default function MyComp(){
    return (
        <h1>我是新组件MyComp</h1>
    )
} 

在需要引入组件的地方import导入组件,并放在相应位置

//App.js
import MyComp from './components/MyComp'
function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          编辑 <code>src/App.js</code> 并且重新加载
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
        //新组件
        <MyComp></MyComp>
      </header>
    </div>
  );
}

export default App;

需要注意的地方

  • 组件名称首字母必须大写
  • 如果return的内容太大,不能与return 处于同一行,则需要对return的内容添加小括号()

JSX规则

  1. 要从组件返回多个元素,使用一个父标签封装他们。如果你不想在标记中额外添加div可以使用<></>
  2. JSX要求标记被显示闭合:像这样的自闭标签一定要写成,想
  3. 这样的环绕标签一定要写成
  4. 驼峰式大多数东西。比如class要命名成className

JSX中使用大括号

js中的变量可以通过"{}"的方式传入JSX中,从而使html中渲染的数据可以得到控制。任何 JavaScript 表达式都可以在大括号之间工作,包括像 formatDate() 这样的函数调用:

export default function TodoList() {
  const name = 'Gregorio Y. Zara';
  return (
    <h1>{name}'s To Do List</h1>
  );
}
//函数调用
const today = new Date();

function formatDate(date) {
  return new Intl.DateTimeFormat(
    'en-US',
    { weekday: 'long' }
  ).format(date);
}

export default function TodoList() {
  return (
    <h1>To Do List for {formatDate(today)}</h1>
  );
}
何处使用{}
  • 作为文本 直接在 JSX 标签内<div>{name}'s To Do List\.</div>有效,但<{tag}>Gregorio Y. Zara's To Do List</{tag}>无效。
  • 作为属性 紧跟在 = 符号之后: src={avatar} 将读取 avatar 变量,但 src=“{avatar}” 将传递字符串 “{avatar}”。
使用双大括号

除了字符串、数字和其他js表达式外,甚至可以在jsx中插入对象。在jsx中插入对象,必须将对象封装在另一个对大括号中。person={{name:'henry',age:22}}
一般在插入内联样式的时候会用到双大括号

export default function TodoList() {
  return (
    <ul style={{
      backgroundColor: 'black',
      color: 'pink'
    }}>
      <li>Improve the videophone</li>
      <li>Prepare aeronautics lectures</li>
      <li>Work on the alcohol-fuelled engine</li>
    </ul>
  );

传递属性

React通过传递属性(props)相互通信。每个父组件都可以通过给他们属性将一些信息传递给他们的子组件

第一步 将属性传递给子组件

首先在父组件中给子组件添加属性

export default function Profile() {
  return (
    <Avatar
      person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
      size={100}
    />
  );
}

第二步 子组件读取属性

function Avatar({ person, size }) {
  // person and size are available here
}

默认属性

可以在接受时为属性添加默认值

function Avatar({ person, size = 100 }) {
  // ...
}

使用JSX的展开语法转发属性

当组件需要把自身接受到的属性转发给子组件时,可用展开语法精简代码

function Profile({ person, size, isSepia, thickBorder }) {
  return (
    <div className="card">
      <Avatar
        person={person}
        size={size}
        isSepia={isSepia}
        thickBorder={thickBorder}
      />
    </div>
  );
}

简化后:

function Profile(props) {
  return (
    <div className="card">
      <Avatar {...props} />
    </div>
  );
}

传递JSX

可以把组件作为prop参数传递,父组件通过{children}来接收,类似于vue的slot

import Avatar from './Avatar.js';

function Card({ children }) {
  return (
    <div className="card">
      {children}
    </div>
  );
}

export default function Profile() {
  return (
    <Card>
      <Avatar
        size={100}
        person={{ 
          name: 'Katsuko Saruhashi',
          imageId: 'YfeOqp2'
        }}
      />
    </Card>
  );
}

条件渲染

通过if判断渲染

通过变量来控制返回的jsx

if (isPacked) {
  return <li className="item">{name} ✔</li>;
}
return <li className="item">{name}</li>;

条件(三元)运算符 (? : )

还可以用更简洁的三元运算符进行条件渲染

return (
  <li className="item">
    {isPacked ? name + ' ✔' : name}
  </li>
);

逻辑与运算符(&&)

当你想在条件为真时渲染一些jsx,或者什么也不渲染,可以使用“&&”

return (
  <li className="item">
    {name} {isPacked && '✔'}
  </li>
);

渲染列表

可以通过js数组的filter() 和 map() 来过滤数据数组并将其转换为组件数组。

从数组中渲染组件

const people = [
 'Creola Katherine Johnson: mathematician',
 'Mario José Molina-Pasquel Henríquez: chemist',
 'Mohammad Abdus Salam: physicist',
 'Percy Lavon Julian: chemist',
 'Subrahmanyan Chandrasekhar: astrophysicist'
];

export default function List() {
 const listItems = people.map(person =>
   <li>{person}</li>
 );
 return <ul>{listItems}</ul>;
}

通过filter()方法过滤条目数组

const people = [{
  id: 0,
  name: 'Creola Katherine Johnson',
  profession: 'mathematician',
}, {
  id: 1,
  name: 'Mario José Molina-Pasquel Henríquez',
  profession: 'chemist',
}, {
  id: 2,
  name: 'Mohammad Abdus Salam',
  profession: 'physicist',
}, {
  name: 'Percy Lavon Julian',
  profession: 'chemist',  
}, {
  name: 'Subrahmanyan Chandrasekhar',
  profession: 'astrophysicist',
}];
export default function List() {
  const chemists = people.filter(person =>
    person.profession === 'chemist'
  );
  const listItems = chemists.map(person =>
    <li>
      <img
        src={getImageUrl(person)}
        alt={person.name}
      />
      <p>
        <b>{person.name}:</b>
        {' ' + person.profession + ' '}
        known for {person.accomplishment}
      </p>
    </li>
  );
  return <ul>{listItems}</ul>;
}

响应事件

在组件内定义事件响应函数,并把函数作为属性值传递到JSX上

export default function Button() {
  function handleClick() {
    alert('You clicked me!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

也可以直接在JSX中内联事件

<button onClick={function handleClick() {
  alert('You clicked me!');
}}>

状态:组件的内存

组件内需要存储的数据叫做状态。状态相当于组件的内存,存放着需要记忆的数据。

使用useState()

import { useState } from 'react';

创建state使用useState()来创建,他需要给定一个初始值作为参数。创建一个数组来接收这个状态,这个数组包含一个state的名称,和一个修改这个state的方法。

const [isSent, setIsSent] = useState(false);
const [message, setMessage] = useState('Hi!');

修改state的值

state的值不能直接修改,需要借用useState提供的第二个参数。

setIsSent(true);

setXXX()方法会触发React进行重新渲染。

将state中的引用类型视为只读

如果state的值是数组或者对象,那么使用setXXX()方法修改时就不能直接修改原值,而是需要重新创建一份赋给state

对象

修改对象一般通过扩展运算符、Object.assign()等方法来复制原对象然后重新赋值给state

export default function Form() {
  const [person, setPerson] = useState({
    firstName: 'Barbara',
    lastName: 'Hepworth',
    email: 'bhepworth@sculpture.com'
  });

  function handleFirstNameChange(e) {
    setPerson({
    //通过扩展运算符复制一份原对象给新对象再赋值给state
      ...person,
      firstName: e.target.value
    });
  }

数组

修改数组一般通过map()、filter()、slice()等方法复制一份新数组再赋值给state

import { useState } from 'react';

let nextId = 0;

export default function List() {
 const [name, setName] = useState('');
 const [artists, setArtists] = useState([]);

 return (
   <>
     <h1>Inspiring sculptors:</h1>
     <input
       value={name}
       onChange={e => setName(e.target.value)}
     />
     <button onClick={() => {
       setArtists([
         ...artists,
         { id: nextId++, name: name }
       ]);
     }}>Add</button>
     <ul>
       {artists.map(artist => (
         <li key={artist.id}>{artist.name}</li>
       ))}
     </ul>
   </>
 );
}

Immer插件

如果对象或数组有深层嵌套用普通的复制方法比较复杂,使用immer插件可以简化操作。它可以让你像修改原数组那样直接修改对象的属性或数组中的某项值,但其实他在内部已经帮你创建了一个副本并赋予state
步骤

  1. 运行 npm install use-immer 以将 Immer 添加为依赖
  2. 然后用 import { useImmer } from ‘use-immer’ 替换 import { useState } from ‘react’

使用方法

import { useImmer } from 'use-immer';

export default function Form() {
  const [person, updatePerson] = useImmer({
    name: 'Niki de Saint Phalle',
    artwork: {
      title: 'Blue Nana',
      city: 'Hamburg',
      image: 'https://i.imgur.com/Sd1AgUOm.jpg',
    }
  });

  function handleNameChange(e) {
    updatePerson(draft => {
      draft.name = e.target.value;
    });
  }

  function handleTitleChange(e) {
    updatePerson(draft => {
      draft.artwork.title = e.target.value;
    });
  }

组件通信

父传子通过props进行,子传父通过调用父组件定义的方法来实现,此方法通过prop传递给子组件
父传子

//子组件
function Child (prop){
	return 
	   <div>{props.msg}</div>
}

//父组件
function Father (){
let msg = 'hello world'
	return (
	<Child msg={msg}></Child>
  )
}

子传父

// 子传父,通过 props 调用父组件的方法
this.props.handleClick(xxx)

// 父组件中
<Child handleClick={this.handleClick}></Child>

兄弟传值
可以通过context来进行兄弟组件传值。context不仅可以用于兄弟组件传值,还可以用于更复杂关系的组件的传值。
引入

export const { Provider, Consumer } = React.createContext("sky")

在兄弟组件的共同上层定义一个Provider,通过provider中的value属性把想要传递的值赋予它

export default class ClassComp extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            name: 'tracer'
        }
    }
    render() {
        return (
            <Provider value={this.state.name}>
                <div>
                    <h1>爷爷:{this.state.name}</h1>
                    <ClassComp2 />
                </div>

            </Provider>
        )
    }
}

这个Provider所在的组件的所有下级都将共享这个数据。后代组件通过在该组件中创建的Consumer来获取值。

import { Consumer } from './ClassComp' //引入
export default class ClassComp2 extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
        }
    }
    render() {
        return(
            <Consumer>
                {(value)=>
                <div>
                    <h1>爸爸:{value}</h1>
                <ClassComp3/>
                </div>
                }
            </Consumer>
        )
    }
}
USB3.0 Type-B连接器SSTX/SSRX信号定义常见错误与硬件设计避坑指南 本文详细解析了USB3.0 Type-B连接器中SSTX/SSRX信号的定义标准与常见设计错误。针对连接器厂商图纸可能出现的信号标识错误,提供了实用的排查方法和硬件设计避坑指南,帮助工程师避免因引脚定义颠倒导致的通信降级或故障,确保USB3.0高速传输的稳定性。 阅读详情

相关推荐

传统芯片封装工艺流程简介

塑封是将工件和树脂安装在模具中,加热模具,使树脂液化充满模具,降温保持一定时间后,树脂凝结为固态即可取出。它将一个大的晶圆切割成许多单独的小块,每个小块是一个“芯片”(Chip,die),这些芯片是单个集成电路的基本单位。对裸露在外的引线框架外脚电镀Sn-Pb合金,这样不仅可以提高外脚的抗氧化性,还有利于后续与印刷电路板的焊接。导电胶粘贴法:将含有银粉的环氧树脂(银浆)涂敷在框架或基板上,再将芯片放置其上,固化后可以将芯片牢牢粘接。引线框架的各腿是用筋连接着的,起支撑作用,塑封固化后,需要将其连筋切掉。

芯想是陈的博客 3191

React Suspense 尝鲜

前言 如同字面意思,Suspense 让组件遇到异步操作时进入“悬停”状态,等异步操作有结果时再回归正常状态。 异步操作简单归为两类: 异步加载代码 异步加载数据 异步加载代码 异步加载代码就是所谓的 code splitting,实现起来就像是这样: import React, {lazy, Suspense} from 'react'; const OtherComponent...

大灰狼的小绵羊哥哥的博客 2240

一文帮你彻底搞懂ARM Debug Interface之SWD(转)

ARM的文档写的已经很好了,但是关于上电以后的第一时间应该怎么操作,依然写的不够清晰,导致我第一次用的时候还是费了一些周折。今天做一个详细的梳理,希望能够帮助到更多的朋友。BTW, ARM_Cortex-M0/3 DesignStart系列会持续更新,只是中间可能会穿插其他知识点。SWD是Serial Wire Debug的简称,翻译成中文是”串行线调试”。

2302_79847220的博客 6861

React Use Hook 尝鲜

最近继续在找处理 React 异步调用的方式……主要是现在需求比较复杂,用 cache query 的方式去实现有那么一丢丢的麻烦,又不是很想用额外的包,所以就想看看有没有比较好的一些处理方式。当然,可以用到生产环境上的没找到,不过找到了一个还在试验阶段的新功能——usehook,毫不夸张地说,这个 hook 打破了 React 既有的 hook 规范。use具体的 proposal 和 discussion 在这里:,里面还有一些挺有趣的 hooks 和用法,比如说已经被 merged 的。

GoldenaArcher的博客 960

从零配置ORB-SLAM3:TUM-VI数据集yaml文件参数调优指南

本文深入解析了ORB-SLAM3在TUM-VI数据集上的yaml配置文件参数调优方法。针对双目惯性模式,详细拆解了相机标定、IMU噪声模型和ORB特征提取三大模块的关键参数,解释了其原理与影响,并通过实战案例展示了如何通过调整特征点数量、FAST阈值及IMU噪声参数,有效提升系统在低纹理环境下的鲁棒性和轨迹精度。

weixin_29071809的博客 151

手把手教你用YOLOv5和OpenCV实现DNF全自动刷图(含自动拾取与Boss战逻辑)

本文详细介绍了如何使用YOLOv5和OpenCV构建DNF全自动刷图系统,包括环境配置、游戏画面采集、目标检测、场景导航及操作控制等核心模块。通过实战案例,帮助开发者掌握游戏自动化技术,实现自动拾取与Boss战逻辑,提升游戏效率。

weixin_42628941的博客 450

React Loops 尝鲜

一个简单的Loops 我们先来实现一个简单的需求,使用 React 打印 数组 中的数据并显示 相信聪明的你早已想到了解决方案,以下是我的实现 import React from 'react' const List = () => { const arr = [1, 2, 3, 4] return ( <ul> { arr...

weixin_34259159的博客 208

【规则引擎连载3】 WebSphere ILOG JRules 开发——新建一个规则项目

规则项目依赖于bom,bom来自于一个Java项目,所以在建规则项目之前,需要先建立一个Java项目,也就是建模。 说明:原则上是一个规则项目,一个bom。如果规则项目很多,并且每个规则项目的bom都是一样的,那么可以将bom提取出来,单独作为一个项目,这样减少不必要的重复操作,减少维护成本,降低出错几率。这里逐步讲解两种方法来创建规则项目,推荐第二种。 本文主要建立两种规则项目与bom之间的关系,编写相关的规则内容,如操作规则、规则流、决策表等,在后续文章中详细讲解 。

manman的分享 2331

bun全栈开发尝鲜:用bun-react-template实现Markdown文章展示

引言 本文是一个 bun 尝鲜项目,将介绍如何使用 bun-react-template 创建一个简单的全栈应用,实现 Markdown 文章展示功能。

hans774882968的博客 1457

AUTOSAR TcpIp模块 以太网配置开发2

someip协议之tcpIp协议

汽车电子电气 1085

FlashBootloader01-基于UDS的Flash Bootloader【架构篇】

文章目录1 Flash Bootloader的依赖项2 Flash Bootloader中使用的UDS的主要功能3 Flash Bootloader更新固件3.1 初始化MCU3.2 刷写流程 1 Flash Bootloader的依赖项 通常Flash Bootloader由以下四方面组成: UDS协议 上位机「编写Bootloader Sequence」 通信驱动(如CAN ) Flash Driver 2 Flash Bootloader中使用的UDS的主要功能 1. 10 02服务 客户端

3592

在 React 和 Vue 中尝鲜 Hooks

在美国当地时间 10 月 26 日举办的 React Conf 2018 上,React 官方宣布 React v16.7.0-alpha 将引入名为 Hooks 的新特性,在开发社区引发震动。 在 React 和 Vue 中尝鲜 Hooks 而就在同月 28 日左右,作为 “摸着鹰酱过河” 优秀而典型代表的 Vue.js 社区,其创始人 Evan You 就在自己的 github 上发布了 vu...

li420520的博客 1657

芯片标称具备8kVESD能力却在8kV测试中失效?

芯片级ESD(HBM模型)与系统级ESD(IEC 61000-4-2)存在本质差异:

硬核科技 647

React-Router V5 尝鲜

新特性 完全兼容老版本v4 支持 React 16 , 兼容 React >= 15 消除在 React.StrictMode 严格模式中的警告 使用 create-react-context 实现 context API 新功能 Route 组件 path 可以为数组 before<Switch> <Route path="/users/:id" compon...

weixin_34184158的博客 310

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【React 19 尝鲜】第一篇:use和useActionState

React 19 新特性探索:use和useActionState实践 本文介绍了React 19中的两个新特性:use钩子和Context API改进。use钩子可以用于消费Context和Promise,支持在条件语句中使用Context,并简化了Provider写法。对于Promise消费,文章通过分页查询示例展示了如何结合React Router使用use+Suspense实现数据加载,重点说明了如何通过URL参数变化触发数据重新加载,并分享了使用中的注意事项(需在Suspense内使用、错误处理机

fkcaikengren 780

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

React之Suspense尝鲜,处理前后端IO异步操作

Suspense主要用来解决网络IO问题,它早在2018年的React 16.6.0版本中就已发布。它的相关用法有些已经比较成熟,有的相对不太稳定,甚至经历了重命名、删除:在render函数中,我们可以写入一个异步请求,请求数据react会从我们缓存中读取这个缓存如果有缓存了,直接进行正常的render如果没有缓存,那么会抛出一个异常,这个异常是一个promise。

subsistent的博客 729

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

React Suspense 尝鲜,处理前后端IO异步操作

Suspense主要用来解决网络IO问题,它早在2018年的React 16.6.0版本中就已发布。它的相关用法有些已经比较成熟,有的相对不太稳定,甚至经历了重命名、删除:如果你还没有明白这是什么意思那我简单的表述成下面这句话: 看着是非常神奇的,用同步方法写异步,而且没有yield/async/await,简直能把人看傻眼了。这么做的好处自然就是,我们的思维逻辑非常的简单,清楚,没有callback,没有其他任何玩意,不能不说,看似优雅了非常多而且牛逼。在前端开发中,经常会有这样的需求,加载某个界面时,如

葡萄城技术团队博客 7242

react 16.6 懒加载 Lazy 尝鲜

转载:https://juejin.im/post/5bd70def6fb9a05d38282c30 react 16.6 发布了新的功能lazy,和一个组件Suspense 下面我们看一下他的用法 首先我们先创建两个组件 LazyTest.1 和 LazyTest.2,内容相同 import React, { Component } from 'react' e...

aysfbctcu511961230的博客 147

React学习1-1运行尝鲜

1、在my-app>src中打开index.js即为启动文件 import React from 'react' import ReactDOM from 'react-dom' ReactDOM.render( <h1>hello world</h1>, //jsx语法:javaScript+hmtl(xml的一种)的混合写法 document.querySelector('#root') ) //另外一种写法,暂时认知取别为获取dom有没有#的区别,其他未知 Rea

m0_37780367的博客 152

React + Ramda: 函数式编程尝鲜

原文:Functional Components with React stateless functions and Ramda 阅读本文需要的知识储备: 函数式编程基本概念(组合、柯里化、透镜) React 基本知识(组件、状态、属性、JSX) ES6 基本知识(class、箭头函数) React 无状态函数 React 组件最常...

weixin_34240657的博客 452

React-native 尝鲜计划-场景切换(Navigator)

在上篇文章《react-native 尝鲜计划-环境搭建》中讲述了react-native 的环境搭建,并初始化了 react-native 的第一个项目。如果你已经完成了上一片文章的学习,并且成功调试第一个 “hello world” 项目,你已成功地经迈出第一步,接下来的学习就会顺利德多。在我成功调试出第一个项目之后,连蒙带差的走读了下原生代码和 index.android.js 代码,脑海里有很多疑问,第一个疑问就是:react-native 如何做多个页面跳转的?相信你也一样,带着带着问题来学习是比

4076

未来已来:useWhisper React Native版本开发进展与尝鲜体验

OpenAI Whisper作为当下最热门的语音识别模型之一,正深刻改变着开发者处理语音数据的方式。而useWhisper作为一款专为React生态打造的语音处理钩子库,如今也将目光投向了移动开发领域——React Native版本正在积极开发中,为移动应用带来实时语音转录、语音录制和静音移除等强大功能。 ## 🚀 React Native版本开发亮点 根据项目最新动态,useWhisper

gitblog_00415的博客 443

react-router-dom 6.4版本的尝鲜和总结

React Router 6.4 版本是继6.0大版本更新之后的又一重要里程碑。此版本发布于2024年,旨在进一步优化开发者体验,提供更加强大和灵活的路由功能。6.4版本在前一版本的基础上,引入了新的数据抽象,增强了导航钩子,使得UI与数据的同步更加容易。

工作的日常记录和平凡的生活分享 1626
上一篇: BFC块级格式化上下文
下一篇: 元素的位置属性offset、client、scroll
菊の物语
博客等级 码龄10年 322粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值