96SEO 2026-02-20 00:08 13
React高效的原因6.React强大之处二、React基础格式1.什么是虚拟dom2.为什么要创建虚拟dom三、React也分为俩种创建方式1.

使用js的方式来创建2.使用jsx方式创建四、jsx的语法规则五、react定义组件1.函数式组件2.类式组件3.函数式组件和类式组件的区别六、
、事件处理八、react收集表单1.非受控组件2.受控组件九、高阶函数1.高阶函数2.函数柯里化十、
组件的生命周期1.什么是组件的生命周期2.钩子函数的作用3.生命周期的意义4.生命周期使用场景5.react
自己整理的react文档结合官网和所学知识的一个总结希望对各位有用。
话不多说看下文
而Vue是通过一种拓展的HTML语法进行渲染但其实这只是表面现象毕竟React并不必须依赖JSX。
.
在深层上模板的原理不同这才是他们的本质区别React是在组件JS代码中通过原生JS实现模板中的常见语法比如插值条件循环等都是通过JS语法实现的更加纯粹更加原生。
.
而Vue是在和组件JS代码分离的单独的模板中通过指令来实现的比如条件语句就需要
最小化页面重绘。
关于虚拟DOM1.本质上是object类型的对象一般对象2.虚拟DOM比较轻真实DOM比较重。
因为虚拟DOM6.React强大之处
它并不直接对DOM进行操作引入了一个叫做虚拟DOM的概念安插在javascript逻辑和实际的DOM之间性能好
虚拟DOM帮助我们解决了跨浏览器问题它为我们提供了标准化的API甚至在IE8中都是没问题的。
Flux是一个用于在JavaScript应用中创建单向数据层的架构它随着React视图库的开发而被Facebook概念化。
比如使用RequireJS来加载和打包而Browserify和Webpack适用于构建大型应用。
它们使得那些艰难的任务不再让人望而生畏
initial-scale1.0titleDocument/title
src./js/react.development.js/script!--
src./js/react-dom.development.js/script!--
src./js/babel.min.js/scriptscript
ReactDOM.render(虚拟dom真实dom)ReactDOM.render(VDOM,document.getElementById(test))/script
首先我们需要完成基础引入react。
然后先创建一个虚拟dom再把虚拟dom在指定元素里渲染成真实dom
我们知道虚拟DOM的概念是由Facebook的React团队最早提出来的也是React框架的核心概念之一。
它的作用是以js的形式在内存中描述真实的DOM结构这样当页面内容需要发生变动时React可以通过对前后虚拟DOM的比对计算出如何以最小的代价操作真实DOM。
initial-scale1.0titleDocument/title
src../js/react.development.js/script!--
src../js/react-dom.development.js/scriptscript
React.createElement(标签名标签属性标签内容)const
React.createElement(span,{},hello
ReactDOM.render(虚拟dom真实dom)ReactDOM.render(VDOM,
document.getElementById(test));/script
initial-scale1.0titleDocument/title
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
React.createElement(标签名标签属性标签内容)const
(h1hellospanreact-dom/span/h1)//
ReactDOM.render(虚拟dom真实dom)ReactDOM.render(VDOM,
document.getElementById(test));/script
initial-scale1.0titleDocument/titlestyle.title{color:
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
React.createElement(标签名标签属性标签内容)const
ReactDOM.render(虚拟dom真实dom)ReactDOM.render(VDOM,document.getElementById(test));/script
4.内联样式要用style{{key:value}}的形式去写
1.若是小写字母开头则将改标签转化为html同名的元素渲染到页面
2.若大写字母开头react就会去渲染对应的组件若组件没有定义则报错/五、react定义组件
**声明**组件化是React的核心思想也是我们后续课程的重点前面我们封装的App本身就是一个组件
组件化提供了一种抽象让我们可以开发出一个个独立可复用的小组件来构造我们的应用。
React的组件相对于Vue更加的灵活和多样按照不同的方式可以分成很多类组件
这些概念有很多重叠但是他们最主要是关注数据逻辑和UI展示的分离
当然还有很多组件的其他概念比如异步组件、高阶组件等我们后续再学习。
initial-scale1.0titleDocument/titlestyle.title
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
h2我是用函数定义的组件(适用于【简单组件】的定义/h2}//
ReactDOM.render(虚拟dom真实dom)ReactDOM.render(MyComponent
document.getElementById(test));/*执行ReactDOM.render()方法之后发生了什么1.React解析了组件标签找到了对应的组件2.发现这个组件是一个函数定义的
随后调用改函数生成了一个虚拟dom3.最后将虚拟dom转化为真实dom呈现在页面中*//script
initial-scale1.0titleDocument/titlestyle/style
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
React.Component{//render方法是放在原型上//
---实例对象render(){console.log(render中的this,this)return
h2我是用类定义的组件(适用于【复杂组件】的定义/h2}}ReactDOM.render(MyComponent
document.getElementById(test));/*执行ReactDOM.render()方法之后发生了什么1.React解析了组件标签找到了对应的组件2.发现这个组件是一个类定义的
随后new出来一个实例对象并通过该实例对象调用原型上的render方法3.最将render()
返回的内容生成一个虚拟dom4.最后将虚拟dom转化为真实dom呈现在页面中*/let
MyComponent();console.log(c)/script
1、函数组件是一个纯函数它接收一个props对象返回一个react元素而类组件需要去继承React.Component并且创建render函数返回react元素。
initial-scale1.0titleDocument/titlestyle/style
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
onClick{this.changewWea***r}今天天气很爽
})//这里的修改是覆盖还是合并}}ReactDOM.render(Wea***r
document.getElementById(test));/script
initial-scale1.0titleDocument/title
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
{//是否接受取决于是否使用外部数据super(props)//只能上面接受了propssuper()就去传递否则后续的使用可能就会出现问题}static
PropTypes.string.isRequired,//限制name为字符串类型必填//
(ulli姓名{name}/lili性别{sex}/lili年龄{age
1}/li/ul)}}/*问题1.数据类型是否有对应的限制2.数据的数量
批量传输可以使用展开运算符*/ReactDOM.render(Wea***r
document.getElementById(test))/script
是父组件与子组件交互的唯一方式。
要修改一个子组件你需要使用新的
来重新渲染它。
但是在某些情况下你需要在典型数据流之外强制修改子组件。
被修改的子组件可能是一个
链接https://juejin.cn/post/7047113456993959972
著作权归作者所有。
商业转载请联系作者获得授权非商业转载请注明出处。
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
{//转款专用每一个ref都是唯一的存在this.refs中let
this.refs;alert(ipt.value)}getData(){let
this.refs;alert(ipt1.value)}render()
onClick{this.showData}点我提示左侧的数据/buttoninput
document.getElementById(test))/script
2)React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
idtest/divulli/lili/lili/lili/lili/lili/lili/lili/lili/lili/lili/lili/li/ul!--
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
{alert(this.myRef.current.value)console.log(event.target)}showData1
{alert(this.myRef1.current.value)}//
onClick{this.showData}点我提示左侧的数据/buttoninput
document.getElementById(test))/script
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
{handler(event){event.preventDefault();//阻止默认事件
this;alert(你输入的名字${username.value},密码是${password.value})}render()
typesubmit登录/button/form/div)}}ReactDOM.render(Person
document.getElementById(test))/script
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
{event.preventDefault();//阻止默认事件
this.state;alert(你输入的名字${username},密码是${password})}render()
typesubmit登录/button/form/div)}}ReactDOM.render(Person
document.getElementById(test))/script
高阶函数如果一个函数符合下面2个规范中的任何一个那么它就是属于一个高阶函数
2.若A函数调用的返回值依然是一个函数那么A也可以称为高阶函数
常见的高阶函数Promise,setTimeout,arr.map回调函数等等函数柯里化通过函数的继续调用
返回值为函数的方式实现的多次接收参数最会统一处理的函数编码形式
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
console.log(event.target.value,)this.setState({[dataType]:
{event.preventDefault();//阻止默认事件
this.state;alert(你输入的名字${username},密码是${password})}render()
onChange{this.saveFormData(username)}
onChange{this.saveFormData(password)}
typesubmit登录/button/form/div)}}ReactDOM.render(Person
document.getElementById(test))/script
柯里化Currying是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数并且返回接受余下的参数且返回结果的新函数的技术
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
标识当前标签this.setState({[dataType]:
event.target.value})}//表单提交回调handler
{event.preventDefault();//阻止默认事件
this.state;alert(你输入的名字${username},密码是${password})}render()
typesubmit登录/button/form/div)}}ReactDOM.render(Person
document.getElementById(test))/script
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
1}constructor(){super();console.log(constructor)}//组件将要挂载componentWillMount(){console.log(componentWillMount)}//组件将要卸载componentWillUnmount(){console.log(啊
我Neo写咋)clearInterval(this.timer)}//组件挂载完成之后componentDidMount()
{console.log(componentDidMount)setInterval(()
200)}death(){//卸载组件ReactDOM.unmountComponentAtNode(document.getElementById(test))}render()
onClick{this.death}按钮/button/div)}}//
2.渲染到页面中的指定domReactDOM.render(Person
document.getElementById(test))/script
由组件内部this.setSate()或父组件重新render触发
由ReactDOM.unmountComponentAtNode()触发
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
由ReactDOM.render()触发---初次渲染1.constructor()2.componentWillMount()3.render()4.componentDidMount()
常用一般在这个钩子中做一些初始化的事情例如开启定时器发送网络请求2.
由组件内部this.setSate()或父组件重新render触发1.shouldComponentUpdate()2.componentWillUpdate()3.render()
由ReactDOM.unmountComponentAtNode()触发1.componentWillUnmount()
{ReactDOM.unmountComponentAtNode(document.getElementById(test))}force
(divh2当前求和为{this.state.count}/h2button
onClick{this.add}点我1/buttonbutton
onClick{this.death}卸载组件/buttonbutton
onClick{this.force}不更改任何状态中的数据强制更新/button/div)}}//
onClick{this.changeCar}换车/buttonB
(div我是b组件,接收到的车是:{this.props.carName}/div)}}ReactDOM.render(A
document.getElementById(test))/script
由组件内部this.setSate()或父组件重新render触发
由ReactDOM.unmountComponentAtNode()触发
src../js/react.development.js/script!--
src../js/react-dom.development.js/script!--
src../js/babel.min.js/scriptscript
由ReactDOM.render()触发---初次渲染1.constructor()2.componentWillMount()3.render()4.componentDidMount()
常用一般在这个钩子中做一些初始化的事情例如开启定时器发送网络请求2.
由组件内部this.setSate()或父组件重新render触发1.shouldComponentUpdate()2.componentWillUpdate()3.render()
由ReactDOM.unmountComponentAtNode()触发1.componentWillUnmount()
{ReactDOM.unmountComponentAtNode(document.getElementById(test))}force
(divh2当前求和为{this.state.count}/h2button
onClick{this.add}点我1/buttonbutton
onClick{this.death}卸载组件/buttonbutton
onClick{this.force}不更改任何状态中的数据强制更新/button/div)}}//
getDerivedStateFromProps(props,state){//
全部依赖于外部的props那么可以使用这个生命周期函数return{carName:qq}}//
获取数据getSnapshotBeforeUpDate(prevState,prevProps){}render()
onClick{this.changeCar}换车/buttonB
(div我是b组件,接收到的车是:{this.props.carName}/div)}}ReactDOM.render(A
document.getElementById(test))/script
现在使用会出现警告下一个大版本需要加上UNSAFE_前缀才能使用以后可能会被彻底废弃不建议使用。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback