写点什么

万字血书 React—走近 React

  • 2023-07-07
    福建
  • 本文字数:3696 字

    阅读完需:约 12 分钟

配置开发环境


脚手架工具 create-react-app


储备知识:终端或命令行、代码编辑器


React官方中文文档


获取地址:http://www.jnpfsoft.com/?from=infoq

create-react-app


其是基于 Node 的快速搭建 React 项目的脚手架工具。


npx create-react-app testdemocd testdemonpm i
复制代码


npx 命令是 npm v5.2.0 引入的一条命令,无需安装脚手架包,就可以直接使用这个包提供的命令


yarn 是 Facebook 发布的包管理器,功能与 npm 相同,具有快速、可靠和安全的特点


React with TypeScript


npx create-react-app testdemo-ts --template typescriptcd testdemonpm i
复制代码


About TypeScript


  • TypeScript 是 JavaScript 的超集


  • 给原生 JavaScript 添加类型检查


  • 与 ES6 一样目前无法被主流浏览器直接读取


Compile TypeScript


编译器:ts-loader、awesome-typescript-loader 以及 babel-loader


编译器配置文件:tsconfig.json


{  "compilerOptions": {    "noImplicitAny": false, //不需要显示地声明变量的类型any    "target": "es5", //编译后的目标js版本    "lib": [      "dom",      "dom.iterable",      "esnext"    ], //库文件,过这些库文件,告诉typescript编译器可以使用哪些功能    "allowJs": true, //允许混合编译js文件    "skipLibCheck": true,    "esModuleInterop": true,    "allowSyntheticDefaultImports": true, //允许使用commonJs方式import默认文件    "strict": true,      "forceConsistentCasingInFileNames": true,    "noFallthroughCasesInSwitch": true,    "module": "esnext", //配置代码模块系统,Node.js的commonJs、ES6的esnext、requireJs的AMD    "moduleResolution": "node",// 决定编译器的工作方式    "resolveJsonModule": true,    "isolatedModules": true, //编译器会将每个文件作为单独的模块使用    "noEmit": true, //发生错误时候,编译器不会生成Js代码    "jsx": "react-jsx" //允许编译器支持编译react代码  },  "include": [    "src"  ] //使用此选项列出我们需要编译的文件, “文件路径”选项需要文件的相对或绝对路径}
复制代码


Update to TypeScript


1、npm install --save typescript @types/node @types/react @types/react-dom @types/jest2、所有js文件改为jsx文件3、import react
复制代码


React 基础


About React


History of FE


HTML、CSS、JavaScript——Ajax——jQuery——Angular MVC——Vue、React MVVM


Why is React?


  • 单向数据流


  1. 你只需要描述 UI(HTML)看起来是什么样子,就和写 HTML 一样

  2. React 负责渲染 UI,并在数据变化时更新 UI


  • 虚拟 DOM


类似于 Docker 或 VMware 的 Snapshot 的快照技术



  • 组件化


  1. 保持交互的一致性

  2. 保持视觉风格的统一

  3. 便于程序员之间的协作


  • 学习一次,随意使用(必杀技)


  1. 使用 React 可以开发 Web 应用

  2. 使用 React 可以开发移动端原生应用(react-native)

  3. 使用 React 可以开发 VR(虚拟现实)(react 360)


What is React?


React 是一个用于构建用户界面(HTML 页面)的 JavaScript 库


主要用来写 HTML 页面,或构建 Web 应用


如果从 MVC 角度来看,React 仅仅是视图层(V),只负责视图的渲染,不提供完整的 M 和 C 的功能

(经典 MVC 模式中,M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式。)


起源:Facebook 的内部项目


JSX


What is JSX?


What's this?HTML?JS?


const element = <h1>Hello,world!</h1>
复制代码


这是 ReactJS 自创的语言:JSX


  • JSX 不是标准的 ECMAScript 语法,只是语法扩展


  • 对于 React 项目使用 js 和 jsx 都可以


  • ts 对应 tsx 语法


拓展阅读:react-jsx、react-jsxdev


JSX 其实是React.createElement的语法糖,下图的两种写法完全等价:



Why is JSX?


  • React 并不强制使用 JSX,也可以使用原生的 JavaScript


  • React 认为视图的本质是:渲染逻辑与 UI 视图表现的内在统一


  • React 把 HTML 与渲染逻辑进行了耦合,形成了 JSX


Features of JSX


  • HTML 代码可以与 JSX 兼容


  • 可以在 JSX 中嵌入表达式


  • 使用 JSX 指定子元素


Attention


  • React 元素的属性名使用小驼峰命名法


  • 特殊的属性名:class->className、for->htmlFor、tabindex->tabIndex


  • 如果元素没有子节点可以用/>结束


  • 推荐使用小括号包裹 JSX,从而避免 JS 中的自动插入分号陷阱


基本使用


JXS 中使用(嵌入)Js 表达式


数据存储在 JS 中,语法:{JavaScript 表达式} 注意:语法是单大括号


const name = '张三'// 1、使用JSX创建react元素const title = <h1>Hello {name}</h1>
//2、渲染react元素ReactDOM.render(title, document.getElementById('root'))
复制代码


React DOM 在渲染所有输入内容之前,默认会进行转义。它可以确保在你的应用中,永远不会注入那些并非自己明确编写的内容。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 XSS(cross-site-scripting, 跨站脚本)攻击。


拓展阅读:如何防止XSS攻击?


JSX 的条件渲染


  • 场景:loading 效果


  • 条件渲染:根据条件渲染特点的 JSX 结构


  • 可以使用 if/else 或三元运算符或逻辑与运算符来实现


const loadData = () => {  if (loading) {    return <div>loading...</div>  }
return <div>数据加载完成</div>}
复制代码


JSX 的列表渲染


  • 应该使用数组的 map()方法(映射)


  • 渲染列表时应该添加 key 属性,key 属性的值要保证唯一


  • 原则:map()遍历谁,就给谁加 key 属性


  • 注意:尽量避免使用索引号作为 key


const songs = [  { id: 1, name: '爱你' },  { id: 2, name: '年少有为' },  { id: 3, name: '南山南' },]  // 1、使用JSX创建react元素const list = (  <ul>    {songs.map(item => <li key={item.id}>{item.name}</li>)}  </ul>)
复制代码


JSX 的样式处理


详见:React的行内样式与CSS


CSS of React


The way of import css file


  • 直接引入整个 css 文件


import './index.css'<div className="app">
复制代码


使用简单,但可能会造成样式的全局污染和样式冲突。


  • JSS 模块化引入组件


import style from './index.css'<div className={style.app}>
复制代码


需要额外配置,ts 环境需要配置*.d.ts的类型声明文件


declare module "*.css" {    const css: {        [key: string]: string //约定:导出key所在的对象,原始的类名和内容都会和转化为这个对象    };    export default css;}
复制代码


CSS module/JSS


  • 每个 jsx 或 tsx 文件被视为一个独立存在的原件


  • 原件所包含的所有内容也同样都应该是独立存在的


拓展阅读:CSS in Js


CSS & TypeScript


Ts 的优势就是给 Js 进行类型检查,那么通过 JSS 将 CSS 转换为 Js 对象,是不是也可以给 CSS 添加类型?


插件:typescript-plugin-css-modules


npm i typescript-plugin-css-modules --save-dev
复制代码


在 tsconfig.json 文件 compilerOptions 新增:


"plugins": [{   "name":"typescript-plugin-css-modules"}]
复制代码


新建.vscode 文件夹——新建文件 settings


{    "typescript.tsdk": "node_modules/typescript/lib",    "typescript.enablePromptUseWorkspaceTsdk": true}
复制代码


配置后会发现编写 style 也会有只能提示


Media & fonts


src/assets/imagessrc/assets/fontssrc/assets/icons
复制代码


State & Props


Difference


  • props 是组件对外的接口,而 state 是组件对内的接口


  • props 用于组件间的数据传递,而 state 用于组件内部的数据传递


State


State 是组件的“私有属性”


初始化


//构造函数constructor是唯一可以初始化state的地方constructor(props){    super(props);    this.state = {        count: 0    }}
复制代码


修改


//使用setState()修改数据,更新组件状态,调用render函数重新渲染onClick = {() => {    this.setState({isOpen: !this.state.isOpen});}}
复制代码


异步更新 同步执行


调用 setState 后,state 不会立即改变,是异步操作(React 会将多个修改合并为一个)。所以,不要依赖当前的 State,计算下个 State。


setState 本身并非异步,但对 state 的处理机制给人一种异步的假象。


onClick = {() => {    this.setState((preState, preProps) => {        return {count: preState.count + 1}    },() => {        console.log("count" ,this.state.conut)    });        this.setState((preState, preProps) => {        return {count: preState.count + 1}    },() => {        console.log("count" ,this.state.conut)    });}}
复制代码


Props


本质上,props 就是传入函数的参数,是父组件传向子组件的数据。


父组件


<ul>	{robots.map(r => <Robot id={r.id} name={r.name} email={r.email}></Robot>)}</ul>
复制代码


子组件


//为Robot指定类型React.FC,FC(functional component)函数式组件的接口,接受泛型参数P(Props)const Robot: React.FC<RobotProps> = (props) => {    const id = props.id;    const name = props.name;    const email = props.email;    return (<div className={styles.cardContainer}>        <img src={`https://robohash.org/${id}`} alt="robot" />        <h2>{name}</h2>        <p>{email}</p>    </div>    );}
复制代码


Immutable


props 是只读的,一旦创建不可被改变,只能通过销毁、重建来改变数据。


优点:通过判断内存是否一致,来确认对象是否有经过修改,极大提高性能效率


使用 Immutable 来编写程序的方式就是函数式编程(组件)。


文章转载自:https://www.cnblogs.com/gfhcg/p/17265829.html

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
万字血书React—走近React_React_不在线第一只蜗牛_InfoQ写作社区