当前位置: 首页 > news >正文

独立网站系统信阳搜索引擎优化

独立网站系统,信阳搜索引擎优化,网站建设构架,海沧建设网站多少文章目录 2.6. 组件的生命周期2.6.1. 效果2.6.2. 理解2.6.3. 生命周期流程图(旧)2.6.4. 生命周期流程图(新)2.6.5. 重要的勾子2.6.6. 即将废弃的勾子2.6.7 getSnapshotBeforeUpdate 2.7. 虚拟DOM与DOM Diffing算法2.7.1. 效果2.7.2. 基本原理图 2.6. 组件的生命周期 2.6.1. 效…

文章目录

    • 2.6. 组件的生命周期
      • 2.6.1. 效果
      • 2.6.2. 理解
      • 2.6.3. 生命周期流程图(旧)
      • 2.6.4. 生命周期流程图(新)
      • 2.6.5. ==重要的勾子==
      • 2.6.6. 即将废弃的勾子
      • 2.6.7 getSnapshotBeforeUpdate
    • 2.7. 虚拟DOM与DOM Diffing算法
      • 2.7.1. 效果
      • 2.7.2. 基本原理图

2.6. 组件的生命周期

2.6.1. 效果

需求:定义组件实现以下功能:

  1. 让指定的文本做显示 / 隐藏的渐变动画
  2. 从完全可见,到彻底消失,耗时2S
  3. 点击“不活了”按钮从界面中卸载组件
<!-- 准备好一个“容器” -->
<div id="test"></div>
<!-- 引入三个库 -->
<script type="text/babel">class Demo extends React.Component{state = {opacity:1}death = ()=>{//卸载组件ReactDOM.unmountComponentAtNode(document.getElementById('test'))}//组件挂完毕componentDidMount(){console.log('componentDidMount');this.timer = setInterval(() => {//获取原状态let {opacity} = this.state//减小0.1opacity -= 0.1if(opacity <= 0) opacity = 1//设置新的透明度this.setState({opacity})}, 200);}//组件将要卸载componentWillUnmount(){//清除定时器clearInterval(this.timer)}//初始化渲染、状态更新之后render(){console.log('render');return(<div><h2 style={{opacity:this.state.opacity}}>React学不会怎么办?</h2><button onClick={this.death}>不活了</button></div>)}}//渲染组件到页面ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))
</script>

2.6.2. 理解

1.组件从创建到死亡它会经历一些特定的阶段。
2.React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
3.我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。

2.6.3. 生命周期流程图(旧)

生命周期的三个阶段(旧)

  1. 初始化阶段: 由ReactDOM.render()触发—初次渲染
    1.constructor()
    2.componentWillMount()
    3.render()
    4.componentDidMount()
  2. 更新阶段: 由组件内部this.setSate()或父组件重新render触发
    1.shouldComponentUpdate()=
    2.componentWillUpdate()
    3.render()
    4.componentDidUpdate()
  3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发
    1.componentWillUnmount()
<!-- 准备好一个“容器” -->
<div id="test"></div>
<!-- 引入三个库 -->
<script type="text/babel">/* 1. 初始化阶段: 由ReactDOM.render()触发---初次渲染1.	constructor()2.	componentWillMount()3.	render()4.	componentDidMount() =====> 常用一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息2. 更新阶段: 由组件内部this.setSate()或父组件render触发1.	shouldComponentUpdate()2.	componentWillUpdate()3.	render() =====> 必须使用的一个4.	componentDidUpdate()3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发1.	componentWillUnmount()  =====> 常用一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息*/class Demo extends React.Component{constructor(props){console.log("Count---construtor");super(props)//初始化状态this.state = {count:0}}//加按钮的回调add = () =>{//获取原状态const {count} = this.state;this.setState({count:count+1})}//卸载组件按钮的回调dath = ()=>{React.unmountComponentAtNode(document.getElementById('test'))}//强制更新的按钮force = ()=>{this.forceUpdate()}//组件将要挂在的钩子函数componentWillMount(){console.log('Count---componentWillMount');}//组件挂在完毕componentDidMount(){console.log('Count---componentDidMount');}//组件将要卸载的钩子componentWillUnmount(){console.log('Count---componentWillUnmount');}//控制组件更新的阀门,默认为true,必须要有返回值shouldComponentUpdate(){console.log('Count---shouldComponentUpdate');return true}//组件将要更新的钩子componentWillUpdate(){console.log('Count---componentWillUpdate');}//组件更新完毕的钩子componentDidUpdate(){console.log('Count---componentDidUpdate');}render(){console.log('Count---render');const {count} = this.statereturn(<div><h2>当前求和为:{count}</h2><button onClick={this.add}>点我+1</button><button onClick={this.death}>卸载组件</button><button onClick={this.force}>不更改任何状态中的数据,强制更新一下</button></div>)}     }//父组件Aclass A extends React.Component{//初始化状态state = {carName:'奔驰'}changeCar = ()=>{this.setState({carName:'奥拓'})}render(){return(<div><div>我是A组件</div><button onClick={this.changeCar}>换车</button><B carName={this.state.carName}/></div>)}}//子组件Bclass B extends React.Component{//组件将要接收新的props的钩子componentWillReceiveProps(props){console.log('B---componentWillReceiveProps',props);}//控制组件更新的“阀门”shouldComponentUpdate(){console.log('B---shouldComponentUpdate');return true}//组件将要更新的钩子componentWillUpdate(){console.log('B---componentWillUpdate');}//组件更新完毕的钩子componentDidUpdate(){console.log('B---componentDidUpdate');}render(){console.log('B---render');return(<div>我是B组件,接收到的车是:{this.props.carName}</div>)}}//渲染组件到页面ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))
</script>

2.6.4. 生命周期流程图(新)

生命周期的三个阶段(新)

  1. 初始化阶段: 由ReactDOM.render()触发—初次渲染
    1.constructor()
    2.getDerivedStateFromProps
    3.render()
    4.componentDidMount()
  2. 更新阶段: 由组件内部this.setSate()或父组件重新render触发
    1.getDerivedStateFromProps
    2.shouldComponentUpdate()
    3.render()
    4.getSnapshotBeforeUpdate
    5.componentDidUpdate()
  3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发
    1.componentWillUnmount()
<!-- 准备好一个“容器” -->
<div id="test"></div>
<!-- 引入三个库 -->
<script type="text/babel">/* 1. 初始化阶段: 由ReactDOM.render()触发---初次渲染1.	constructor()2.	getDerivedStateFromProps 3.	render()4.	componentDidMount() =====> 常用一般在这个钩子中做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息2. 更新阶段: 由组件内部this.setSate()或父组件重新render触发1.	getDerivedStateFromProps2.	shouldComponentUpdate()3.	render()4.	getSnapshotBeforeUpdate5.	componentDidUpdate()3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发1.	componentWillUnmount()  =====> 常用一般在这个钩子中做一些收尾的事,例如:关闭定时器、取消订阅消息*/class Demo extends React.Component{//构造器constructor(props){console.log('Count---constructor');super(props)//初始化状态this.state = {count:0}}//加1按钮的回调add = ()=>{//获取原状态const {count} = this.state//更新状态this.setState({count:count+1})}//卸载组件按钮的回调death = ()=>{ReactDOM.unmountComponentAtNode(document.getElementById('test'))}//强制更新按钮的回调force = ()=>{this.forceUpdate()}//若state的值在任何时候都取决于props,那么可以使用getDerivedStateFromPropsstatic getDerivedStateFromProps(props,state){console.log('getDerivedStateFromProps',props,state);return null}//在更新之前获取快照getSnapshotBeforeUpdate(){console.log('getSnapshotBeforeUpdate');return 'atguigu'}//组件挂载完毕的钩子componentDidMount(){console.log('Count---componentDidMount');}//组件将要卸载的钩子componentWillUnmount(){console.log('Count---componentWillUnmount');}//控制组件更新的“阀门”shouldComponentUpdate(){console.log('Count---shouldComponentUpdate');return true}//组件更新完毕的钩子componentDidUpdate(preProps,preState,snapshotValue){console.log('Count---componentDidUpdate', preProps, preState, snapshotValue);}render(){console.log('Count---render');const {count} = this.statereturn(<div><h2>当前求和为:{count}</h2><button onClick={this.add}>点我+1</button><button onClick={this.death}>卸载组件</button><button onClick={this.force}>不更改任何状态中的数据,强制更新一下</button></div>)}}//渲染组件到页面ReactDOM.render(<Demo a="1" b="2"/>,document.getElementById('test'))
</script>

2.6.5. 重要的勾子

1.render:初始化渲染或更新渲染调用
2.componentDidMount:开启监听, 发送ajax请求
3.componentWillUnmount:做一些收尾工作, 如: 清理定时器

2.6.6. 即将废弃的勾子

1.componentWillMount
2.componentWillReceiveProps
3.componentWillUpdate

现在使用会出现警告,下一个大版本需要加上UNSAFE_前缀才能使用,以后可能会被彻底废弃,不建议使用。

2.6.7 getSnapshotBeforeUpdate

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>4_getSnapShotBeforeUpdate的使用场景</title><style>.list{width: 200px;height: 150px;background-color: skyblue;overflow: auto;}.news{height: 30px;}</style>
</head>
<body><!-- 准备好一个“容器” --><div id="test"></div><!-- 引入react核心库 --><script type="text/javascript" src="../js/17.0.1/react.development.js"></script><!-- 引入react-dom,用于支持react操作DOM --><script type="text/javascript" src="../js/17.0.1/react-dom.development.js"></script><!-- 引入babel,用于将jsx转为js --><script type="text/javascript" src="../js/17.0.1/babel.min.js"></script><script type="text/babel">class NewsList extends React.Component{state = {newsArr:[]}componentDidMount(){setInterval(() => {//获取原状态const {newsArr} = this.state//模拟一条新闻const news = '新闻'+ (newsArr.length+1)//更新状态this.setState({newsArr:[news,...newsArr]})}, 1000);}getSnapshotBeforeUpdate(){return this.refs.list.scrollHeight}componentDidUpdate(preProps,preState,height){this.refs.list.scrollTop += this.refs.list.scrollHeight - height}render(){return(<div className="list" ref="list">{this.state.newsArr.map((n,index)=>{return <div key={index} className="news">{n}</div>})}</div>)}}ReactDOM.render(<NewsList/>,document.getElementById('test'))</script>
</body>
</html>

2.7. 虚拟DOM与DOM Diffing算法

2.7.1. 效果

需求:验证虚拟DOM Diffing算法的存在

2.7.2. 基本原理图

经典面试题:1). react/vue中的key有什么作用?(key的内部原理是什么?)2). 为什么遍历列表时,key最好不要用index?1. 虚拟DOM中key的作用:1) key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。2). 详细的说: 当状态中的数据发生变化时,react会根据【新数据】生成【新的虚拟DOM】, 随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较,比较规则如下:a. 旧虚拟DOM中找到了与新虚拟DOM相同的key:(1).若虚拟DOM中内容没变, 直接使用之前的真实DOM(2).若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOMb. 旧虚拟DOM中未找到与新虚拟DOM相同的key根据数据创建新的真实DOM,随后渲染到到页面2. 用index作为key可能会引发的问题:1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。2. 如果结构中还包含输入类的DOM:会产生错误DOM更新 ==> 界面有问题。3. 注意!如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,使用index作为key是没有问题的。3. 开发中如何选择key?1.数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。2.如果确定只是简单的展示数据,用index也是可以的。

文章转载自:
http://dinncocovalency.bkqw.cn
http://dinncoimpaction.bkqw.cn
http://dinncoboring.bkqw.cn
http://dinncolipizzan.bkqw.cn
http://dinncovoyager.bkqw.cn
http://dinncoleucine.bkqw.cn
http://dinncosantir.bkqw.cn
http://dinncounpleated.bkqw.cn
http://dinncoetherial.bkqw.cn
http://dinncoanisometropia.bkqw.cn
http://dinncotrigonometry.bkqw.cn
http://dinncotuitional.bkqw.cn
http://dinncocantabank.bkqw.cn
http://dinncolegislatively.bkqw.cn
http://dinncotrippy.bkqw.cn
http://dinncoataxia.bkqw.cn
http://dinncokindly.bkqw.cn
http://dinncoindentation.bkqw.cn
http://dinncopoddy.bkqw.cn
http://dinncoglagolitic.bkqw.cn
http://dinncocolonialism.bkqw.cn
http://dinncoheroical.bkqw.cn
http://dinncoacidify.bkqw.cn
http://dinncoxerarch.bkqw.cn
http://dinncostow.bkqw.cn
http://dinncotarawa.bkqw.cn
http://dinncomoreover.bkqw.cn
http://dinncocontrition.bkqw.cn
http://dinncospinto.bkqw.cn
http://dinncoulster.bkqw.cn
http://dinncosarcomere.bkqw.cn
http://dinncoregale.bkqw.cn
http://dinncocontraction.bkqw.cn
http://dinncosuccussatory.bkqw.cn
http://dinncovitreum.bkqw.cn
http://dinncoloid.bkqw.cn
http://dinncodiabetes.bkqw.cn
http://dinncocheesecake.bkqw.cn
http://dinncoturbojet.bkqw.cn
http://dinncosalangane.bkqw.cn
http://dinncoabolitionist.bkqw.cn
http://dinncoinvolantary.bkqw.cn
http://dinncolymphatism.bkqw.cn
http://dinncoteletube.bkqw.cn
http://dinncocommensuration.bkqw.cn
http://dinncosemilog.bkqw.cn
http://dinncofiliety.bkqw.cn
http://dinncogeogeny.bkqw.cn
http://dinncophenacaine.bkqw.cn
http://dinncotyphonic.bkqw.cn
http://dinncostringy.bkqw.cn
http://dinncoeffluvia.bkqw.cn
http://dinncotasman.bkqw.cn
http://dinncolongan.bkqw.cn
http://dinncoanthelmintic.bkqw.cn
http://dinncovenerator.bkqw.cn
http://dinncothanky.bkqw.cn
http://dinncobrigand.bkqw.cn
http://dinncoreprofile.bkqw.cn
http://dinncoannunciatory.bkqw.cn
http://dinncocolloquia.bkqw.cn
http://dinncodeobstruent.bkqw.cn
http://dinncolumbosacral.bkqw.cn
http://dinncoradioheating.bkqw.cn
http://dinncomarianist.bkqw.cn
http://dinncosuckling.bkqw.cn
http://dinncoterylene.bkqw.cn
http://dinncomultipoint.bkqw.cn
http://dinncowyse.bkqw.cn
http://dinncoparallax.bkqw.cn
http://dinncoschrod.bkqw.cn
http://dinncodisserve.bkqw.cn
http://dinncooateater.bkqw.cn
http://dinncocareladen.bkqw.cn
http://dinncocauld.bkqw.cn
http://dinncodeclarator.bkqw.cn
http://dinncosesquiplicate.bkqw.cn
http://dinncoscaldingteass.bkqw.cn
http://dinncofrustum.bkqw.cn
http://dinncoacaulescent.bkqw.cn
http://dinncobologna.bkqw.cn
http://dinncocaries.bkqw.cn
http://dinncosmokestack.bkqw.cn
http://dinncocedarbird.bkqw.cn
http://dinncotuneup.bkqw.cn
http://dinncolorimer.bkqw.cn
http://dinncomultispectral.bkqw.cn
http://dinncobonaci.bkqw.cn
http://dinncoexclusion.bkqw.cn
http://dinncoseedless.bkqw.cn
http://dinncoghostliness.bkqw.cn
http://dinncostrained.bkqw.cn
http://dinncovernally.bkqw.cn
http://dinncoencomiastic.bkqw.cn
http://dinncoannulose.bkqw.cn
http://dinncoaztecan.bkqw.cn
http://dinncounconceivable.bkqw.cn
http://dinnconightside.bkqw.cn
http://dinncobaffleboard.bkqw.cn
http://dinncopondage.bkqw.cn
http://www.dinnco.com/news/99014.html

相关文章:

  • 廊坊网络公司网站站长工具国产
  • 织梦网站响应式模板免费下载怎么做网站广告
  • 效果图网站推荐大全面包砖营销型网站策划
  • 百度快照网站网页搜索引擎大全
  • 杭州微信网站制作网络稿件投稿平台
  • 政府网站建设报价清单郑州营销型网站建设
  • 做网站要钱嘛广州网络推广定制
  • 软路由系统如何做网站磁力在线搜索引擎
  • 网络营销图片素材湛江seo网站管理
  • 经济与政府网站建设近三天时政热点
  • wordpress插入html网站关键词怎么优化排名
  • 多语言网站常见的营销策略有哪些
  • 个人网站要备案嘛产品推广公司
  • 用asp.net做的网站有哪些新闻发稿
  • 哪几个网站适合自己做外贸推广注册app拿佣金平台
  • 党政机关如何建设网站网店运营推广实训
  • ftp网站地图怎么做广东最新消息
  • 公司网站建设需要显示什么软件恶意点击广告软件
  • iis 网站建设中十堰seo优化
  • 门户网站app有哪些惠州seo招聘
  • 公司宣传册怎么制作长春做网站公司长春seo公司
  • 宁波怎么建网站模板百度关键词排名突然没了
  • 竞价移动网站从哪里找网络推广公司
  • 中国住房和城乡建设厅网站首页网络营销的四种形式
  • 怎样制作企业的网站长沙疫情最新消息今天封城了
  • 网站建设网络推广书生北京网站推广排名外包
  • 网站建设与网页制作教程免费观看b站的广告网站平台
  • 加盟平台响应网站建设如何做好互联网营销推广
  • 网站开发确认书关键词上首页软件
  • 淘客请人做网站seoul是哪个城市