24资源网

24资源分享网,分享资源,收集整理资源,有态度的分享资源网

前端进阶——React JS

avatar 小四 2023-01-26 19:51 50次浏览 0 条评论 前端

前言

前置学习内容:

前端入门JS & DOM前端常见开发工具浅讲

一、React

1.React简介

由FaceBook在2013年开源的一个用于构建用户界面的JavaScript库,主要用于构建 UI,很多人认为 React 是 MVC 中的 V(视图)。

2.React能做什么

餐饮收银购物车一些小游戏

3.React的特点

声明式编码 −React采用声明范式,可以轻松描述应用。不直接操作DOM −React通过对DOM的模拟,最大限度地减少与DOM的交互。组件化思想 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。一次学习,多端开发 −React可以与已知的库或框架很好地配合。

二、React基础语法

1.引用方式

脚本引入方式:直接使用 Staticfile CDN 的 React CDN 库。(不建议在生成环境中使用,在浏览器中使用 Babel 来编译 JSX 效率是非常低的。)

<!DOCTYPE html> <html> <head> <meta charset=“UTF-8” /> <title>Hello React!</title> <!–React库链接,下方–> <script src=“https://cdn.staticfile.org/react/16.4.0/umd/react.development.js”></script> <script src=“https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js”></script> <!–React库链接,上方–> <script src=“https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js”></script> </head> <body> <div id=“example”></div> </body> <script type=“text/babel”> ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById(example) ); </script> </html>
react.min.js – React 的核心库react-dom.min.js – 提供与 DOM 相关的功能babel.min.js – Babel 可以将 ES6 代码转为 ES5 代码,这样我们就能在目前不支持 ES6 浏览器上执行 React 代码。Babel 内嵌了对 JSX 的支持。通过将 Babel 和 babel-sublime 包(package)一同使用可以让源码的语法渲染上升到一个全新的水平。

Create-React-App:

是FaceBook的React团队官方出的一个构建react单页面应用的脚手架工具。

安装:npm install -g create-react-app

新建React项目:

create-react-app demo(项目名)npm install(安装依赖)或者 yarnnpm start(启动项目)或者 yarn start

目录结构:

demo/ README.md node_modules/ package.json .gitignore public/ favicon.ico index.html manifest.json src/ App.css App.js App.test.js index.css index.js logo.svg

manifest.json 指定了开始页面 index.html,一切的开始都从这里开始,所以这个是代码执行的源头。

src/index.js 是一个入口文件,我们可以直接修改 src/index.js 文件代码:

import React from react; import ReactDOM from react-dom; ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById(example) );

2.React JSX

React 使用 JSX 来替代常规的 JavaScript。JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。我们不需要一定使用 JSX,但它有以下优点:

JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。它是类型安全的,在编译过程中就能发现错误。使用 JSX 编写模板更加简单快速。

JSX类似HTML,以下就是JSX语句:

const element = <h1 className=“title”>Hello, world!</h1>;

元素是构成 React 应用的最小单位,JSX 就是用来声明 React 当中的元素。

由于 JSX 就是 JavaScript,一些标识符像class和for不建议作为 XML 属性名。作为替代,React DOM 使用className和htmlFor来做对应的属性。

JSX中使用自定义属性需要在添加前缀data-,例如:

const element = <h1 className=“title” datastatus=“true”>Hello, world!</h1>;

JSX可以直接写在js文件中,JSX中可以写入JavaScript表达式,需要用{}括起来,例如:

const helloWrold = “Hello,world!” ReactDOM.renter( <h1>{helloWrold}</h1>, document.getElementById(example) );

JSX中允许插入数组,例如:

const helloWrold = [ <p>Helloworld</p>, <p>Reactworld</p> ]; ReactDOM.renter( <div>{helloWrold}</div> document.getElementById(example) );

在 JSX 中不能使用if else语句,但可以使用conditional (三元运算)表达式来替代。

<h1>{i === 1 ? True! : False}</h1>

JSX注释使用{/*注释内容*/}

3.React样式

React样式支持多种导入方式:

1.外部文件导入

import “./index.css”;//import导入外部样式文件
优点:方便、简洁缺点:样式一经加载将全局生效,类名相同时样式之间会互相影响

2.内联样式

<p style={{color:red}}>Helloworld</p>
优点:内联样式,样式之间不会有冲突,可以动态获取当前组件的state状态。缺点:写法上都需要使用驼峰标识,某些样式编辑器没有提示,大量使用这种样式, 代码会混乱,某些样式无法编写(比如伪类/伪元素),性能上不太好,组件每次渲染都会创建新的对象。

3.声明式内联样式

const myCSS = { color:red, backgroundColor : blue; }; ReactDOM.renter( <p style={myCSS}>Helloworld</p>, document.getElementById(“example”); );
优点:内联样式, 样式之间不会有冲突,性能上比直接在style中写入对象的好一点。缺点:写样式时编辑器没有提示,大量使用这种样式, 代码会混乱,某些样式无法编写(比如伪类/伪元素)。

4.CSS模块化

//index.css文件 .myP{ color:red; backgroundcolor:blue; } .myDiv{ border:1px solid; } import styles from “./index.css”; ReactDOM.renter( <div style=“styles[myDiv]”> <p style={styles.myCSS}>Helloworld</p> </div>, document.getElementById(“example”); );
优点:将css文件作为一个模块引入,这个模块中的所有css,只作用于当前组件。不会影响当前组件的后代组件。样式之间不会有冲突。缺点:所有的 className 都必须使用 {style.className} 的形式来编写不方便动态来修改某些样式,依然需要使用内联样式的方式。

4.React组件

所谓组件,即封装起来的具有独立功能的UI部件。我们可以使用函数定义了一个组件,也可以使用 ES6 class 来定义一个组件。

函数组件:

function HelloWorld(){ return <p>Hello World</p>; }

class组件:

class HelloWorld extends React.Component{ renter(){ return <p>Hello World</p>; } }

组件的一些基础方法

1.setState

setState(object nextState[, function callback])
nextState,将要设置的新状态,该状态会和当前的state合并callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。

2.setProps

setProps(object nextProps[, function callback])

3.isMounted

返回值:true或false,表示组件是否已挂载到DOM中

5.React State

React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。

class Name extends React.Component{ constructor(props) { super(props); this.state = {names:[“小明”,“小红”,“李华”],index:0}; this.num = 0; } tick(num){ this.setState({…this.state,index:num}); console.log(this.state.index); } componentDidMount(){ this.timerID = setInterval( () => this.tick(this.num=(this.num+1)%3), 1000 ); } componentWillUnmount() { clearInterval(this.timerID); } render(){ return ( <div> <p>{this.state.names[this.state.index]}</p> </div> ); } } ReactDOM.render( <Name/>, document.getElementById(“root”) );

计算器每秒执行tick更新index值,且执行setState方法更新UI,移除DOM执行componentWillUnmount()卸载定时器。

componentDidMount() 与 componentWillUnmount() 方法被称作生命周期钩子。在组件输出到 DOM 后会执行 componentDidMount() 钩子,我们就可以在这个钩子上设置一个定时器。this.timerID 为定时器的 ID,我们可以在 componentWillUnmount() 钩子中卸载定时器。

6.React Props

state 和 props 的区别:props是不可变的,而 state 可以根据与用户交互来改变。

function Name(props){ return <div> <p>{props.name}</p> </div> } Name.defaultProps = { name : “小红” } Name.propTypes = { name: PropTypes.string }; ReactDOM.render( <Name name={“小明”}/>, document.getElementById(“root”) );
defaultProps可以用于设置props的默认值,当没有对props赋值就使用默认值。propTypes验证器,用于验证props是否是有效类型,若为无效类型,将会在控制台输出警告。

7.React元素渲染

元素渲染

元素是构成 React 应用的最小单位,它用于描述屏幕上输出的内容。要将React元素渲染到根DOM节点中,我们通过把它们都传递给ReactDOM.render()的方法来将其渲染到页面上。

ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById(example) );

更新渲染

React 元素都是不可变的。当元素被创建之后,你是无法改变其内容或属性的。目前更新界面的唯一办法是创建一个新的元素,然后将它传入 ReactDOM.render() 方法。

父组件使用State,子组件使用Props,每秒更新UI,设定Props默认值和验证器,综合2、3、4内容。

class Person extends React.Component{ constructor(props){ super(props); this.state = { names:[“小明”,“小红”,“李华”], homes:[“广场”,“公园”,“学校”], index:0 }; } tick(num){ this.setState({…this.setState,index:num%3}); } componentDidMount(){ this.timerID = setInterval( () => this.tick(this.state.index+1), 1000); } componentWillUnmount(){ clearInterval(THIS.timerID); } render(){ return <div> <Name name={this.state.names[this.state.index]}/> <span>住在</span> <Home home={this.state.homes[this.state.index]}/> </div> } } class Name extends React.Component{ render(){ return <span>{this.props.name}</span> } } Name.defaultProps={ name:“xx” } Name.propTypes={ name:PropTypes.string } class Home extends React.Component{ render(){ return <span>{this.props.home}</span> } } Home.defaultProps = { home:“xx” } Home.propTypes = { home:PropTypes.string } ReactDOM.render( <Person />, document.getElementById(“root”) );

8.React 数组与列表

const numbers = [1, 2, 3, 4, 5]; const listItems = numbers.map((numbers) => <li>{numbers}</li> ); ReactDOM.render( <ul>{listItems}</ul>, document.getElementById(example) );

9.React 事件处理

React 元素的事件处理和 DOM 元素类似。但是有一点语法上的不同:

React 事件绑定属性的命名采用驼峰式写法,而不是小写。如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM 元素的写法)

事件处理格式如下:

<button onClick={activateLasers}> 激活按钮 </button>

10.React表单与事件

class Input extends React.Component{ constructor(porps){ super(porps); this.state = {value:“请输入”}; this.inputChange = this.inputChange.bind(this); } inputChange(e){ this.setState({value:e.target.value}); } render(){ let value = this.state.value; return ( <div> <p style={{ fontSize : 30, fontWeight : 800 }}>{this.state.value}</p> <input value={value} onChange={this.inputChange}/> </div> ); } } ReactDOM.render( <Input />, document.getElementById(“root”) );

注意:this.inputChange =this.inputChange.bind(this);这一步十分重要,手动绑定this。当执行onChange事件时这里面的this不再是原来的this导致this.setState报错,将this进行手动绑定后将解决这个问题。

附录

进阶学习内容:

前端学习内容

参考文献

菜鸟教程React中引入样式的5种方式(代码举例 & 优缺点)

               
发表评论