React基础——安装、JSX、组件、生命周期

https://react.docschina.org/docs/hello-world.htmlReact教程

二、基本使用

webpack、Vue中的一、二搭建webpack环境

(1)安装

npm install --save react react-dom 安装
react:用于创建组件和虚拟DOM,包括组件的生命周期。
react-dom:将组件和虚拟DOM放到页面展示,ReactDOM.render()。

(2)导入包

接收的成员名称必须写为React和ReactDOM。

// index.js
import React from 'react'
import ReactDOM from 'react-dom'

(3)创建虚拟DOM元素

参数1:字符串,表示创建的标签名称;
参数2:对象(包括null),表示创建元素的属性节点;
参数(3~N):子节点,包括其它虚拟DOM或文本子节点。

// index.js
const myh1 = React.createElement('h1', { title: '我是h1', id: 'myh1' }, '首页')
const mydiv = React.createElement('div', null, '外面的div', myh1) // 嵌套h1
/* <div>
  '外面的div'  
  <h1 title="我是h1" id="myh1">首页</h1>
</div> */

上述方式繁琐,创建虚拟DOM元素最好的方式是写html代码,即JSX。 

(4)渲染虚拟DOM元素

React元素都是不可变的,即当元素被创建后,无法改变其内容或属性,一个元素代表应用界面在某一时间点的样子。

参数1:要渲染的虚拟DOM对象
参数2:指定容器的DOM对象

// index.js
ReactDOM.render(mydiv, document.getElementById('app'))

(5)根DOM节点

使用React创建的虚拟DOM元素,会被渲染到这个指定的容器中。用React开发应用时一般只会定义一个根节点。

<!-- index.html -->
<div id="app"></div>

三、JSX简介

JSX,一种JavaScript的语法扩展,符合XML规范(比HTML严格)的JavaScript。推荐在React中使用JSX来描述用户界面。JSX不是模版语言,它完全是在JavaScript内部实现的,运行时转为React.createElement转为普通JS对象,不会直接把JSX渲染至页面上。

可以使用babel来转换JSX。webpack、Vue中的四搭建babel环境,npm install --save-dev @babel/preset-react,webpack.config.js中的test:/\.js$/改为test:/\.js|.jsx$/,.babelrc中增加"presets": ["@babel/preset-react"]

注意:
(1)书写JSX时一般都会带上换行和缩进,增强代码的可读性。
(2)推荐在JSX代码的外面扩(),防止分号自动插入的bug。
(3)如果JSX标签是闭合式的,那么你需要在结尾处用/>。
(4)React DOM使用camelCase小驼峰命名来定义属性的名称,而不是使用HTML的属性名称,如class对应className,tabindex对应tabIndex,label的for属性对应htmlFor。
(5)注释。推荐使用{/* 注释 */},对于{// 注释}后括号要换行
(6)创建DOM时,所有的节点必须有唯一的根元素。

编译JSX代码时,遇到<把它当作HTML代码去编译,遇到{}把其内部的代码当作普通JS代码去编译。

1、表达式

JSX本身就是一种表达式,因为编译后,JSX会被转化为普通的JavaScript对象。可以在if或for语句使用、赋值给变量、当作参数传入、作为返回值等。

JavaScript表达式:可以任意地在JSX中使用JavaScript表达式,表达式包含在{}中。如2+2,user.firstName,formatName(user)等。{}中可以包含数字、字符串、对象(函数)、JSX元素等,布尔值和undefined不在界面显示。

let a=10;
let str="Hello World!"
let flag=true;
let ud=undefined;
const h1=<h1>这是h1</h1>
const arr=[ //Warning: Each child in an array or iterator should have a unique "key" prop.
  <h2>这是h2</h2>,
  <h3>这是h3</h3>
]

ReactDOM.render(
  <div>
    {a+5}<hr />
    {str}<hr />
    {flag?'flag为真':'flag为假'}<hr />
    {String(ud)}<hr />
    {h1}<hr />
    {arr}
  </div>,
  document.getElementById('app')
);

JSX属性:使用引号来定义以字符串为值的属性,或使用大括号来定义以JavaScript表达式为值的属性。

<div tabIndex="0"></div>
<img src={user.avatarUrl} />

例,将普通字符串数组,转为JSX数组。

const arrStr=["毛利兰","柯南"]
const arrJSX=arrStr.map(item=><h3>{item}</h3>) // Warning: Each child in an array or iterator should have a unique "key" prop.

2、防注入攻击

可以放心地在JSX中使用用户输入。React DOM在渲染之前默认会过滤所有传入的值,所有的内容在渲染之前都被转换成了字符串,有效防止XSS攻击。

const title = response.potentiallyMaliciousInput;
// 直接使用是安全的:
const element = <h1>{title}</h1>;

四、组件

组件从概念上看像是函数,它可以接收任意的输入值(props),返回一个需要在页面上展示的React元素。

1、定义组件

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

组件的返回值只能有一个根元素。

(1)使用JavaScript函数

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

(2)使用ES6 class

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

2、组件渲染

当React元素是用户自定义的组件,它会将JSX属性(也可以使用...传递一个对象,即多个JSX属性)作为单个对象传递给该组件,这个对象称为“props”。props是只读的。

// 通过属性传值
const element = <Welcome name="Sara" />;
ReactDOM.render(
  element,
  document.getElementById('root')
);

// 或传递对象
var obj={
  name:"hsg",
  age:25
}

ReactDOM.render(
  <div>
    <Welcome {...obj}></Welcome>
  </div>,
  document.getElementById('app')
);

3、组合与提取组件

组件可以在它的输出中引用其它组件,让我们用同一组件来抽象出任意层次的细节。在React应用中,按钮、表单、对话框、整个屏幕的内容等通常都被表示为组件。

可以将组件切分为更小的组件,便于复用。

function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}

4、将组件封装为.jsx文件

注意使用babel转换.jsx

// Welcome.jsx
import React from 'react'

export default function Welcome(props){
  return <h1>Hello! {props.name}</h1>
}

// index.js
import Welcome from './components/Welcome.jsx' // 想省略.jsx需配置

五、State&生命周期

使用JS函数定义的组件,是无状态组件;使用class关键字定义的组件,是有状态组件。“有状态”即有私有数据(this.state) 和 生命周期函数,运行效率比无状态组件稍低。

1、

 

React中,把key添加给被forEach或map或for循环直接控制的元素

https://blog.csdn.net/yaocong1993/article/details/83119256#%E5%85%AB%E3%80%81%E5%88%97%E8%A1%A8%E6%B8%B2%E6%9F%93v-for%E5%92%8Ckey%E5%B1%9E%E6%80%A7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章