commit 639450a8c62f85adf8856fb4a264a4e236b5b90c Author: 1708-huayu <57060237+1708-huayu@users.noreply.github.com> Date: Thu Oct 19 14:19:45 2023 +0800 init diff --git a/npm/npm镜像设置.md b/npm/npm镜像设置.md new file mode 100644 index 0000000..adb2465 --- /dev/null +++ b/npm/npm镜像设置.md @@ -0,0 +1,14 @@ +查看当前镜像 + +```apl +npm help config +npm config get registry +``` + +设置全局镜像 + +```shell +npm config set registry https://registry.npm.taobao.org --global +``` + +版本管理:[GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions](https://github.com/nvm-sh/nvm#usage) diff --git a/react/1.概述.md b/react/1.概述.md new file mode 100644 index 0000000..f88d84f --- /dev/null +++ b/react/1.概述.md @@ -0,0 +1,79 @@ +# 原生JavaScript,dom +1. 原生JavaScript操作DOM繁琐效率低 +2. 使用JavaScript直接操作DOM,浏览器会进行大量的重绘重排. +3. 没有组件化编码方案,代码复用率低 +# React的特点 +用于构建用户界面的javaScript库,操作DOM呈现页面 +## 声明式 +相对命令式. +## *组件式 + +## 学习一次随处使用 +开发web应用 +开发移动端原生应用,react-native +VR开发react360 + +浏览器安装React Developer Tool + +#### 模块 +1. 理解:向外提供特定功能的js程序,一般就是一个js文件 +2. 为什么要拆成模块:随着业务逻辑增加,代码越来越多且复杂 +3. 作用:复用js,简化js编写,提高js运行效率 +#### 组件 +1. 理解:用来实现局部功能效果的代码和资源的集合(html,css,js,image等等) +2. 为什么:一个界面的功能更复杂 +3. 作用:复用编码,简化项目编码,提高运行效率. + +# 使用 +npm升级 +```shell +npm install -g npm@9.2.0 +npm i create-create-app -g +``` +## 创建项目 +```shell +npx create-react-app my-app +``` +```shell +npm i react react-dom +``` +## 引入 react和react-dom两个js文件 +## 创建React元素 +React.createElement('元素名称,标签h,p',属性,子节点,子节点,子节点...) +## 渲染react元素到页面中 +ReactDOM.render(要渲染的元素,渲染挂载点) +```html + +
+ + + + + + +``` + +# React脚手架的使用 +```shell +npx create-react-app my-app +npm start +``` +引入改成导入 +``` +// es6中模块语法 +import React from 'react' +import ReactDOM from 'react-dom' +``` + +```html +import React from 'react'; +import ReactDOM from 'react-dom'; + +const title = React.createElement('p',{title:"我是段落",id:"p1"},'hello xian',React.createElement('span',null,'hello hua')) +ReactDOM.render(title,document.getElementById('root')) +``` \ No newline at end of file diff --git a/react/2.jsx.md b/react/2.jsx.md new file mode 100644 index 0000000..7cc96e5 --- /dev/null +++ b/react/2.jsx.md @@ -0,0 +1,106 @@ +# createElement +劣势 +1. 繁琐不简洁 +2. 不直观,不能一眼看出代码表述 +3. 不优雅,用户体验差 +# jsx +语法与html类似 +JSX 是JavaScript XML的简写,表示在JavaScript代码中写xml(html)格式的代码.React的核心内容 +优势:声明式语法更加直观,与html结构相同,降低成本,提高开发效率 +React完全利用js语言自身能力来编写UI,而不是造轮子增强HTML功能(没有自定义指令). +```html +import React from 'react'; +import ReactDOM from 'react-dom'; + +// const title = React.createElement('p',{title:"我是段落",id:"p1"},'hello xian',React.createElement('span',null,'hello hua')) +// jsx +const title =

hello xianhello hua

+ReactDOM.render(title,document.getElementById('root')) +``` +# 脚手架中使用jsx语法 +1. JSX不是标准的ECMAScript语法,是他的拓展 +2. 需要使用babel(@babel/preset-react)编译后,才能在浏览器中使用 +3. create-react-app脚手架中已经默认有了该配置无需配置. + +# 基本用法 +1. 使用驼峰命名规则 +2. 特殊的属性名 class->className,for->htmlFor,tabindex->tabIndex +3. 没有子节点可以使用/结尾 +4. 推荐在小括号内写JSX +```html +const title = (

hello xianhello hua

) +``` +### 嵌入js +{JavaScript表达式} +```html +const name = "----------------------------" +const title = (

hello xian {name}hello hua

) +``` +### jsx条件渲染 +根据条件渲染特定的jsx结构 +if else ,三目,逻辑与运算符 +```html +const isLoading = false +const loadData= ()=>{ + // if(isLoading){ + // return
loading...
+ // } + // return
数据加载完成,此处显示加载后的数据
+ // return isLoading?(
loading...
):(
数据加载完成,此处显示加载后的数据
) + return isLoading && (
loading...
) +} +const title = ( +

+ 条件渲染{loadData()} +

+) +``` +### jsx 列表渲染 +```html +const songs = [ + {id:1,name:'有为歌'}, + {id:2,name:'水手'}, + {id:3,name:'都是月亮惹的祸'} +] +const list = ( + +) + +ReactDOM.render(list,document.getElementById('root')) +``` +### jsx的样式处理 +#### 行内样式 style +```html +const listStyle = ( +

行内样式

+

类样式

+) +``` +#### 类名 className +```html +import './index.css' +const listStyle = ( +

类样式

+) +``` +css +```html +.title{ + text-align: center; +} +``` + + + + + + + + + + + + + diff --git a/react/3.react组件.md b/react/3.react组件.md new file mode 100644 index 0000000..b23e4cc --- /dev/null +++ b/react/3.react组件.md @@ -0,0 +1,343 @@ +# 组件介绍 +组件表示页面中的部分功能 +组合多个组件实现完整的页面功能 +可复用,独立(相互之间互不影响),可组合 +# 组件的创建方式 + +## 使用函数创建组件 +函数名称必须以大写字母开头 +必须有返回值,返回组件结构 +如果返回null表示不渲染任何内容 + +渲染组件:使用函数名作为组件标签名 +```html +// function Hello(){ +// return (
展示的返回函数组件
) +// } +const Hello =()=>
展示的返回函数组件
+ReactDOM.render(,document.getElementById('root')) +``` +## 使用类创建组件 +类名称必须以大写字母开头 +类组件必须继承React.Component父类 +必须提供render方法 +render方法必须有返回值. +```html +class HelloClass extends React.Component{ + render(){ + return (
leizujian
) + } +} +ReactDOM.render(,document.getElementById('root')) +``` +## 抽离到独立的js文件 +1. 创建HelloRender.js文件 +2. 在HelloRender.js文件中导入React +3. 创建组件 +4. 在HelloRender.js中导出该组件 +5. 在index.js中导入HelloRender组件 +6. 渲染组件 +```html +import HelloRender from './learn/HelloRender' +ReactDOM.render(,document.getElementById('root')) +``` +``` +import React from "react" + +class HelloRender extends React.Component{ + render(){ + return ( +
抽离到js文件中的组件
+ ) + } +} + +export default HelloRender +``` + +# 事件处理 +驼峰命名 +on+事件名称={事件处理程序} +## 类 +```html +class AppOnClick extends React.Component{ + handleClick(){ + console.log('单机') + } + render(){ + return ( + + ) + } +} + +ReactDOM.render(,document.getElementById('root')) +``` +## 函数 +```html +function AppOnClickFun(){ + function handleClick(){ + console.log('单机function') + } + return ( + + ) +} +ReactDOM.render(,document.getElementById('root')) +``` +## 事件对象 +```html +class AppOnClickUrl extends React.Component{ + handleClick(e){ + // 阻止浏览器默认跳转行为 + e.preventDefault() + console.log('单机,阻止浏览器默认跳转行为') + } + render(){ + return ( + 点击 + ) + } +} + +ReactDOM.render(,document.getElementById('root')) +``` + +## 有状态组件和无状态组件 +状态(state)即数据 +函数组件又叫无状态组件,只负责数据展示(静) +类组件又叫有状态组件,负责更新UI,让页面动起来 + + + +## 组件中的state和setState +```html +class AppState extends React.Component{ + constructor(){ + super() + this.state= { + count:0 + } + } + // state= { + // count:0 + // } + render(){ + return ( +
有状态组件,{this.state.count}
+ ) + } +} + +ReactDOM.render(,document.getElementById('root')) +``` +修改状态 +```html +class AppState extends React.Component{ + constructor(){ + super() + this.state= { + count:0, + test:'a' + } + } + // state= { + // count:0 + // } + render(){ + return ( +
有状态组件,{this.state.count},{this.state.test} + +
+ ) + } +} + +ReactDOM.render(,document.getElementById('root')) +``` +事件处理程序中this的值为undefined,希望this指向组件实例 +事件绑定this指向 +1. 箭头函数,利用箭头函数自身不绑定this的特点. +```html +class AppStateJTThis extends React.Component{ + constructor(){ + super() + this.state= { + count:0 + } + } + onIncrement(){ + console.info('事件处理this'+this) + this.setState({ + count:this.state.count+1 + }) + } + render(){ + return ( +
有状态组件,{this.state.count} + +
+ ) + } +} + +ReactDOM.render(,document.getElementById('root')) +``` +2. Function.prototype.bind()利用ESS中bind方法,将时间处理程序中的this与组件实例绑定到一起 +```html +class AppStateJTThis extends React.Component{ + constructor(){ + super() + this.onIncrement= this.onIncrement.bind(this) + this.state= { + count:0 + } + } + onIncrement(){ + console.info('事件处理this'+this) + this.setState({ + count:this.state.count+1 + }) + } + render(){ + return ( +
有状态组件,{this.state.count} + +
+ ) + } +} + +ReactDOM.render(,document.getElementById('root')) +``` +3. class实例方法 +```html +class AppStateJTThis extends React.Component{ + constructor(){ + super() + this.state= { + count:0 + } + } + onIncrement=()=>{ + console.info('事件处理this'+this) + this.setState({ + count:this.state.count+1 + }) + } + render(){ + return ( +
有状态组件,{this.state.count} + +
+ ) + } +} + +ReactDOM.render(,document.getElementById('root')) +``` +方法是一个特殊的属性. +类中的方法默认开启了局部严格模式,所以changeWeather中的this为undefined, +use strict 使用严格模式 + +实例调用,直接调用(严格模式下,this为undefined) + +组件内的标签可以定义ref属性来标识自己 + +箭头函数中的this找外层的this. + +## 事件处理 +1. 通过onXxx属性指定事件处理函数,必须驼峰 + 1. React使用的是自定义合成事件,而不是使用原生DOM事件,为了更好兼容性 + 2. React中的事件是通过事件委托方式处理的(委托给组件最外层的元素),为了更高效 +2. 可以通过event.target得到发生事件的DOM元素对象,避免过度使用ref + + +# 表单处理 +## 受控组件,其值受到React控制的表单元素 +1. html中表单元素是可输入的,也就是有自己的可变状态 +2. react中可变状态通常通过state处理,并且只能通过setState()来处理 +3. react将state与表单元素值value绑定到一起,由state的值来控制表单元素的值 +4. 类似vue中双向绑定 +### 使用步骤 +1. 在state中添加一个状态,作为表单元素的value值(控制表单元素的来源) +2. 给表单元素绑定change事件,将表单元素的值设置为state值(控制表单元素值的变化) +### 使用一个事件处理程序同时处理多个表单元素 +1. 给表单添加一个name属性,名称与state相同 +2. 根据表单元素类型获取对应值 +3. 在change事件处理程序中通过name来修改对应的state +```html +class AppInput extends React.Component{ + constructor(){ + super() + this.state= { + txt:'请输入值', + context:'', + city:'bj', + isChecked:false + } + } + handleClick=e=>{ + console.info('事件处理this'+this) + const target = e.target; + const value = target.type === 'checkbox'?target.checked:target.value + const name = target.name + this.setState({ + [name]: value + }) + console.info('name:'+name+',value:'+value) + } + render(){ + return ( +
+
+