用于构建用户界面的 JavaScript 库
Document
npx create-react-app 项目名称
cd 项目名称
npm start
const element = Hello, world!
;
既不是字符串也不是 HTML。它被称为 JSX,是一个 JavaScript 的语法扩展。JSX 可以很好地描述 UI 应该呈现出它应有交互的本质形式,具有 JavaScript 的全部功能。
在JSX中嵌入表达式
JSX 也是一个表达式
特定属性
JSX 防止注入攻击
JSX 表示对象
React 只更新它需要更新的部分, 局部刷新, Diff算法
这里的代码在'3.组件&Props'中一起写着哦~
// App.js
import './App.css';
import ClassComponets from './components/ClassComponents';
import SonComponets from './components/SonComponents'
// 函数组件
function App() {return (// 可使用空标签, <>> 相当于 将标签包裹起来 <>- app1
- app2
- app3
{/* 向子组件传值 */} >);
}
export default App;
//ClassComponents
//引入react
import { Component } from 'react'
// 创建类组件 必须继承react中的Component(导入) 如果未导入react, 直接继承React.Component即可
class ClassComponets extends Component{// 渲染函数render(){return(<>哈喽a, 空空子!!!
>)}
}
// 导出组件
export default ClassComponets
组件决不能修改自身的 props
所有 React 组件都必须像纯函数一样保护它们的 props 不被更改 (纯函数: 不修改传递进来的参数,且多次调用下相同的入参始终返回相同的结果)
//SonComponents.js
// 元素渲染
//引入react
import { Component } from 'react'
import SonSonComponents from './SonSonComponents'
// 创建类组件 必须继承react中的Component
class SonComponets extends Component{// 构造器 参数props, 用于接收父组件传递的值 props是只读的,不可修改constructor(props){super(props)// state 局部私有 但值可修改this.state = {time : new Date().toLocaleTimeString()}// 为了在回调中使用 `this`,这个绑定是必不可少的 this.updateTime = this.updateTime.bind(this); }// 更新状态updateTime(){this.setState({time : new Date().toLocaleTimeString()})}// 渲染函数render(){// 如果想在本组件的子组件中获取到本组件的父组件的值, 可使用解构const { title } = this.propsreturn(<>Son哈哈哈
现在时间: { this.state.time }
{/* 父组件(App)向子组件传值 */}App传递的值: {this.props.title}
{/* title2是本组件的父组件的值,传递给本组件的儿子 */}儿子传" title2={title}> >)}
}
// 导出组件
export default SonComponets
// SonSonComponents.js
//引入react
import { Component } from 'react'
// 创建类组件 必须继承react中的Component
class SonSonComponets extends Component{// 构造器 参数props, 用于接收父组件传递的值constructor(props){super(props)}// 渲染函数render(){return(<>SonSon哈哈哈
{/* 父组件(App)向子组件传值 */}{this.props.title1}
{this.props.title2}
>)}
}
// 导出组件
export default SonSonComponets
// 元素渲染
//引入react
import { Component } from 'react'
// 创建类组件 必须继承react中的Component
class TimeComponets extends Component{// 构造器 参数props, 用于接收父组件传递的值 props是只读的,不可修改constructor(props){super(props)this.state = {time : new Date().toLocaleTimeString()}}// 钩子函数// 挂载完成后, 已有dom元素componentDidMount(){// 挂载完成后执行, 只执行一次console.log('componentDidMount');//更新 statethis.timeTnterval = setInterval(()=>{this.setState({time : new Date().toLocaleTimeString()})},1000)}// 组件卸载之前 可进行清理内存,清除定时器componentWillMount(){clearInterval(this.timeTnterval)}// 渲染函数render(){return(<>~~~时间~~~
timeComponents---现在时间: { this.state.time }
>)}
}
// 导出组件
export default TimeComponets
// Hook 组件
// Hook不能在class组件中使用, 可以在函数组件中使用
// Hook只能在函数最顶层调用, 不要在循环,条件判断或子函数中调用 在React函数的最顶层以及任何 return之前调用import React,{useEffect, useState} from 'react'function HookComponent(){// 声明一个叫fruits的state变量 返回一对值: 当前状态和让更新它的函数 数组解构 const [fruits, setFruits] = useState('qqq') // const fruit = '' setFruits("abc")const [num,setNum] = useState(0)// 将componentDidMount, componentDidUpdate, componentWillUnMount 合并成一个Hook函数 [依赖项] 如果有依赖项(可有多个),当其中至少有一个依赖项发生变化时,才页面更新, 没有依赖项则每次数据变化页面都更新useEffect(()=>{document.title = `click-${num}-times`},[fruits])// 当页面首次渲染以及有更新的时候, 就先执行清理函数, 再执行函数内容(定时器)useEffect(()=>{let timer = setInterval(()=>{console.log('在Hook中创建定时器')},1000)return ()=>{console.log('在Hook中清理定时器')// 清理副作用clearInterval(timer)}})return (<>{ fruits }
>)}export default HookComponent/* 使用箭头函数直接默认导出
export default ()=>{} */
参考官方文档: https://react.docschina.org/
wo放了好多代码, 是不是因为描述太少, 官方提醒改进质量, 一些注释基本都在代码里边, 偷个小懒不想再单独写出来了呜呜呜, 在这废言凑凑字数叭~~~ 不得不说, 前端的官方文档还是写的都还是挺好的, 大家可以多参考参考文档哦~~~也帮我加加阅读量点赞量什么的呗( 求求~~~ )