react 初识记录(一)

119 阅读6分钟

​持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

1、安装

(1)注意Node的版本要新一些,如果出现安装失败的话就尝试更换node版本

(2)安装命令:npx create-react-app my-app(这是官方推荐的命令)

全局安装:

npm i -g create-react-app
create-react-app my-app

2、概念

React是什么?

React是一个声明式,高效灵活用于构建用户界面的JavaScript库。使用React可以将一些简短、独立的代码片段组合成复杂的UI界面,统称为组件 (来自官方)

React的特点

1、声明式设计(采用声明范式,可以轻松描述应用)

2、高效(采用虚拟Dom,最大限度地减少与Dom的交互)

3、灵活(与已知的库或框架很好的配合)

4、JSX(JavaScript语法的扩展。)

5、组件(通过React构建组件,能提高代码的复用性,能够很好的应用在大项目开发中)

6、单向响应的数据流(能减少重复的代码)

3、React基础

(1)JSX

const say = 'Hello'
​
const element = <div>{say},React</div>

从上面的例子可以知道,声明的变量可以用大括号{}包裹,使其渲染在页面上

在JSX语法中,可以在大括号内放置任何有效的JavaScript表达式。例如加减乘除,obj.a或者Function(some)都是有效的JavaScript表达式。

例子:


function func(name){
  return name.a+' '+name.b
}
const name = {
   a: 'Handsome',
   b: 'Man'
}
const element = {
   <div>Come,{func(name)}</div>
}

在编译之后,JSX表达式会被转为普通JavaScript函数调用,并且对其取值后得到JavaScript对象

例如,可以在if语句和for循环的代码块中使用JSX,将JSX赋值给变量,把JSX当作参数传入,以及从函数中返回JSX


function func(name){
if(name){
   return <div>xxx</div>
}else{
  return <div>bbb</div>
}
}

JSX中指定属性

1、可以通过引号,来将属性值指定为字符串字面量:

const element = js<img src="xxxxxxxxxx"/>

2、也可以使用大括号,在属性值中插入一个JavaScript表达式

const element = js<img src={pic.img} />

tips:在属性中嵌入JavaScript表达式时,不要在大括号外面加上引号。

注意:

JSX语法上更接近JavaScript而不是HTML,所以React DOM使用小驼峰命名来定义属性的名称,而不使用HTML属性名称的命名约定。

例如: HTML的class在JSX变成了className,而tabindex则变为tabIndex

JSX指定子元素

如果一个标签里面没有内容,可以 />闭合标签,类似XML语法

JSX标签里能够包含很多子元素

const element = (
<div>
<div>1</div> <div>2</div>
</div>
)

JSX防止注入攻击

React DOM在渲染所有输入内容之前,默认会进行转义。它可以确保在你的应用中,永远不会注入那些非自己编写的内容。所有内容在渲染之前都会被转换为字符串。能有效防止XSS攻击

JSX表示对象

Babel会把JSX转译为React.createElement()函数调用

示例1:

const element = (
   <div className="xxx">
        Hello,HandsomeMan
   </div>
)

示例2:

const element = React.createElement(
'div', { className: 'xxx' },'Hello,HandsomeMan'
)

两种写法效果完全一致

React.createElement()会预先执行一些检查,确保代码无误,实际上它创建了如下的一个对象

const element = {
    type: 'div',
        props: {
            className: 'xxx',
            children: 'Hello,HandsomeMan'
}
}

这些对象被称为“React元素”。React通过读取这些对象,然后使用它们构建DOM以及保持随时更新

(2)元素渲染

元素是构成React应用的最小砖块

与浏览器的DOM元素不同,React元素是创建开销极小的普通对象。React DOM会负责更新DOM来与React元素保持一致

1、将一个元素渲染为DOM

假设HTML文件某处有一个

,就将其称为“”DOM节点,该节点内所有内容都将由React DOM管理

仅使用React构建的应用通常只有单一的根DOM节点。如果将React集成进一个已有应用,那么可以在应用中包含任意多的独立根DOM节点。

将一个React元素渲染到根DOM节点中,只需把它们一起传入

ReactDOM.createRoot()
const root = ReactDOM.createRoot(

document.getElementById('root')

)

const element = <div>2222</div>

root.render(element);

更新已渲染的元素

React元素是不可变对象。一旦被创建,就无法更改它的子元素或者属性。一个元素就像电影的单帧:它代表了某个特定时刻的UI,更新UI唯一的方式是创建一个全新的元素,并将其传入root.render()。

const root = ReactDOM.createRoot(
  document.getElementById('root')
)
function tick() {
   const element = (
     <div>
      <h1>计时器:{new Date().toLocaleTimeString()}</h1>
     </div>
)
root.render(element);
}
setInterval(tick,1000);

tips:在实践中,大多数React应用只会调用一次root.render()。

React只更新它需要更新的部分

React DOM会将元素和它的子元素与它们之前的状态进行比较,并只会进行必要的更新来使DOM达到预期的状态

(3)组件&Props

1、组件

什么是组件?

从概念上类似于JavaScript函数,它接受任意的入参(即"props"),并返回用于描述页面展示内容的React元素

React的组件分为:函数组件class组件

函数组件

function Hi(props){
    return <div>Hi,{props.name}</div>
}

这个函数就是一个有效的React组件,因为它接受了唯一带有数据的"props"(代表属性)对象,并返回一个React元素。这类组件称为“函数组件”,它的本质就是JavaScript函数

用ES6的class来定义组件则称为:class组件

class Hi extends React.Component {
    render() {
        return <div>Hi,{this.props.name}</div>
    }
}

函数组件与class组件在React中是等效的

(4)渲染组件

当React元素为用户自定义组件时,它会将JSX所接收的属性(attributes)以及子组件(children)转换为单个对象传递给组件,这个对象被称为"props"

tips: 组件名称必须以大写字母开头

(5)组合组件

组件可以在其输出中引用其他组件。这就可以让同一组件来抽象出任意层次的细节。按钮,表单,对话框,甚至整个屏幕的内容:在React应用程序中,这些通常都会以组件的形式表示

Props的只读性

组件无论是使用函数声明还是通过class声明,都绝不能修改本身的props。

function sum(a,b){
   return a+b;
}

这种函数称为“纯函数”,因为该函数不会尝试修改入参,且多次调用下相同的入参始终返回相同的结果。

React规定了所有React组件必须像纯函数一样保护它们的props不会被更改