# React **Repository Path**: lsmhq/React ## Basic Information - **Project Name**: React - **Description**: No description available - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-26 - **Last Updated**: 2021-11-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 索引 全局安装 基本知识 ES6 Install React Native # `React` *[ES6_mine](https://github.com/daifang/js_LS/blob/master/ES6/ES6.md)* ## `全局安装` ``` $ npm i -g create-react-app ``` ## `创建第一个App` ``` $ create-react-app [fileName] //如果安装成功提示不是内部或外部命令 //npx:会自动到目录下查询命令文件,具体信息请看代码块下方链接 $ npx create-react-app [fileName] ``` [npx](http://www.ruanyifeng.com/blog/2019/02/npx.html) ## `启动APP` ``` $ npm start ``` ## `后续安装路由的命令` * 新建一个新项目就要安一次,如果用得到的话 ``` $ npm i reate-router-dom ``` ## `Redux` ``` $ npm i react-redux --save $ npm i --save redux-thunk ``` ## `打包代码` ``` $ npm run build ``` **** ## `基本知识` * 引入模块 * 渲染 * JSX * 组件 * 事件 * PropTypes * 受控组件/非受控组件 * Hook * Router * Context * ## `引入模块` * 建议使用import ``` import [Name] from './src'; var Name = require('./src'); ``` * ## `渲染` * 简单渲染 ``` //在id为 root 的节点下 创建并添加一个ele,ele可以自己用JSX定义 var ele =

Hello React

ReactDom.render(ele,document.getElementbyId('root')); ``` * 引入组件渲染 ``` import App from './app.js'; ReactDom.render(,document.getElementbyId('root')); ``` * ## `JSX` ``` var ele =

Hello React

; //这就是一个JSX表达式,实际在运行中会成为一个普通JS对象 var str = 'Hello World'; var ele_1 =

{str}

; ``` * React元素一旦创建,其内容不会再被修改 * 更新元素的方法,ReactDom.render()/this.setState({}) * ## `组件` * 可以理解为部分,零件,制作汽车一定会先造各个零件再到车间进行组装各个部分,然后再进行最终组装,而组件就是各个部分 * 组件都会返回一个React元素 * props:用于组件之间的通信,父组件<-->子组件,是只读的,大多数是父组件从子组件获取数据再进行操作 * 组件命名 首字母大写 * 周期类|含义 -|- Mounting|已经插入真实DOM Updating|加载中/正在重新渲染 unMounting|已经移出DOM * 周期函数|何时调用 -|- **componentWillMount**|渲染前调用 **componentDidMount**|第一次渲染完成后调用 **shouldComponentUpdate**|返回布尔值,确认是否进行更新 **componentDidUpdate**|组件完成更新后立即调用 **componentWillUnmount**|组件从DOM移除之前立即调用 ``` //建议 使用 import import React from 'react'; //声明 class App extends React.Component{ constructor(){ //必须先调用super(),否则无法使用props super(); //设置初始状态,子组件的props可以进行访问但不可修改 this.state = { one:[],//array two:{},//object three:''//string } } //渲染函数,必须存在,否则无法运行 render(){ return(
) } } ``` * ## `事件` * 点击弹出窗口 ``` import React from 'react'; //最简单的事件触发 class App extends React.Component{ render(){ return (
); }; //建议使用箭头函数,以免this的混乱 alert = ()=>{ alert('点击触发'); }; } ``` * 困难版(event对象和具体操作) ``` import React from 'react'; //效果:按下回车控制台打印输入信息并清空输入框 class App extends React.Component{ constructor(){ super(); this.state = { data:'' } }; render(){ return (

按下Enter

{this.printVal(e)}} value = {this.state.data}/>
); }; //建议使用箭头函数,以免this的混乱 printVal = (e)=>{ //React适配严格等 if(e.keyCode === 13){ console.log(e.target.value); this.setState({ this.state.data = ''; }) } }; } ``` * ## `PropTypes` * 校验数据类型 * 仅限于开发过程中使用 * 引用 ``` import PropTypes from 'prop-types'; ``` * 使用方法 ``` //当data的数据类型不是String时,控制台会进行⚠,说明data不 //是期望的String类型 App.PropTypes = { data:PropTypes.string } ``` *2019-10-11_完成以上* * ## `DefaultProps` * 如果this.prpos中有一个name属性则可以设置默认值 ``` Hello.defaultProps = { name:'daifang' } ``` * ## `受控组件` * 组件节点的各种值都是从this.state中获取,渲染需要用到this.setState * ## `非受控组件` * 组件节点的改变使用refs进行操控,不必使用state * ## `Hook实现组件(只可以在函数组件中使用)` * useState:实现类似setState函数和初始设置state * useEffect:实现类似组件的生命周期函数 * 参数|含义 -|- callback|声明周期到达时执行的方法 arr|数组当中可以定义判断条件,当数组中的元素和之前状态不同时会调用函数,反之不会执行函数体 * 使用方法 ``` import {useState,useEffect} from 'react'; function Name(){ //设置初始值‘daifang’,并创建一个类似setState的方法,但是它不是异步执行的,最好写在组件的最上方 let [name,setName] = useState('daifang'); //useEffect = componentDidMound + componentDidUpdate useEffect(()=>{ /*do something*/ setName('fangdai'); },[/*条件依赖*/]); //当条件依赖为空数组时,执行一次后结束 //useEffect 可以创建多个,根据条件依赖进行判断是否要执行对应的代码段 } ``` * 自定义Hook ``` function useFetch(url){ let [data,setData] = useState; useEffect(()=>{ fetch(url).then(res=>res.json()).then(data=>{ setData(data); }) }); return data; } //调用 function Topic(){ //url为后端提供的接口 let data = useFetch(url); return ( ) } ``` ***2019-10-25-Hook*** * ## `Router` * Router * Route * Link * 代码展示(仅展示结构,不是最终代码,该结构是放到组件中return出来的) ``` //引入 import {BrowserRouter as Router,Route,Link} from 'react-router-dom'; //外部套一个Router标签对儿 //组件加载,这个标签在哪,组件就会加载到哪里 ``` * ## `createContext()` * React.createContext() * React.useContext() * Provider/Consumer * 使用代码 ``` //嫌引入麻烦可以解构引入 import React from 'react'; let ctx = React.createContext(); //标签内的组件都可以访问data ``` * 组件获取数据的方法 * Daifang组件,Fangdai组件相同操作 ``` function Daifang(){ let data = React.useContext(ctx); console.log(ctx); } ``` * 还可以使用Consumer接受数据,Consumer里包裹一个函数,函数的参数就是在Provider当中填写的data ``` ``` * ## `this.setState({})` * ### 写法 ``` //state 获取的是state的上一个状态 this.setState((state,props)=>({todo:state.todo+1})) //写法二 this.setState({ todo:this.state.todo + 1 }) //有什么同步的操作需要放到CallBack中执行,否则不能达到预期效果 //执行顺序同步-->异步-->回调 this.setState({ todo:this.state.todo + 1 },()=>{ console.log(this.state.todo); }) ``` * ## `Redux` * ### 代替组件的state为普通对象 * ### `思想` * ### Store Action Reducer * ### Store * ### Reducer 接受state和action并根据action.type返回对应的state * ## Action * 动作 ``` ``` * ## `Webpack 搭建 React环境` * 安装yarn ``` $ yarn npm i yarn -g ``` * 初始化 ``` $ yarn init -y ``` * 安装webpack ``` $ yarn add webpack webpack-cli -D ``` * 打包 ``` $ npx webpack ``` * 服务 ``` $ yarn add webpack-dev-server -D //启动 $ npx webpack-dev-server ``` * 生成html文件,可以热启动 ``` //打包到内存,然后再显示,内存中有一个html一个js同级关系 $ yarn add html-webpack-plugin -D ``` * 加载 css ``` //css-loader 将所有css合并 //style-loader 将css加到style标签 //配置解析是从右到左所以css-loader要放到最右边 $ yarn add css-loadern style-loader -D ``` * 加载 less 文件 ``` $ yarn add less-loader less -D ``` * 安装 React-只需要安装基本 ``` $ yarn add React React-dom ``` * 解析 JSX ``` $ yarn add babel-loader@8.0.0-beta.0 @babel/core @babel/preset-env -D ``` * 配置完成后 ,可以使用了! * ## `React-Native` * 环境安装(Android Studio + java + react-native) * Android Stdio安装 * 1 下载并安装 * 2 选择自定义,自定义 *SDK* 的安装路径(很重要)和软件的安装路径,其他的默认就好 * 3 设置环境变量,新建 *ANDROID_HOME* 路径写 *SDK* 的路径 * 4 系统变量 *PATH* 中将 *SDK* 的 *platform-tools* 和 *tools* 路径填写进去 * 5 完成 * java安装(重中之重,就因为这个没配利索焦躁了一晚上,我用的1.8版本) * 1 下载 *jdk* * 2 安装 * 3 配置系统变量 * 新建 *JAVA_HOME* 路径是 *jdk* 路径 * 系统变量 *Path* 下新建 路径填写 *jdk* 下 *bin* 路径 * 新建 *classpath* 填写 *.;%JAVA_HOME%\lib\dt.jar%JAVA_HOME%\lib\tools.jar* (非常重要,不然代码运行不了) * 4 完成 * react-native 命令(简单) * 1 安装 ``` //方法一 $ npm i -g react-native-cli //方法二(推荐) //没有yarn先安yarn $ yarn add global react-native-cli ``` * 2 创建 app ``` //第一次可能会要10分钟左右,不要半路放弃 $ react-native init [name] ``` * 3 运行 ``` //也是第一次时间较长 //开启服务 8081 $ npm start //在环境中安装并运行,代码可以先粘一份Hello world 试一试 $ react-native run-android ``` * 4 完成 ![效果](https://github.com/daifang/node-work/blob/master/xlzy/img/helloworld.png) **** ### daifang 修改 2019-11-11 # `用到的ES6方法` * [详情请点击](https://github.com/daifang/js_LS/blob/master/ES6/ES6.md) ## Object.assign(obj_a,obj_b,obj_c,······) * ### `把后面的对象整合到第一个对象上` * ### 拷贝 ``` var obj = {a:100}; var obj_new = Object.assign({},obj); ``` ## Object.keys(obj).forEach(item=>{}) * ### `遍历对象` * 示例 ``` Object.keys(obj).forEach((item)=>{ console.log(item); }); ``` ## Array.map((item,index)=>{}) * ### `遍历数组` * 示例 ``` let arr = [0,1,2,3,4,5,6]; arr.map((item,index)=>{ //item:值 //index:索引 console.log('arr['+index+']' + ':' + item); }) //arr[0]:0 // arr[1]:1 // arr[2]:2 // arr[3]:3 // arr[4]:4 // arr[5]:5 // arr[6]:6 ```