初探React
本文翻译自Cody Lindley的《React Enlightenmen》,已获得作者授权,这套书比较基础,看完以后能让你对React有一定的认识。本文是本书的第一章,主要是以一个浅显的例子引出究竟该如何理解React并且简要的介绍了React的几大要素,适合对React感兴趣,但是一直没真的去了解这个工具的童鞋阅读。
React是一个非常好的工具,基于它可以编写更加容易理解的JavaScript代码,构建并维护无状态或富状态组件。使用它可以通过React nodes划分整体的UI为一个个UI组件(React 组件),React nodes在形式上和HTML nodes很类似,通过渲染,它可以表现为多种形式(HTML/DOM,canvas,svg等等)。
上面这句话可能还不能很清晰的表达出React到底是什么,但是如果通过一个React实例来说明,那你一定能更加容易明白了,本章将为你展示React和React Component,如果在阅读过程中遇到不明白的地方,也不要着急,本书后面的章节会详细解释这些细节。
从我们熟悉的HTML标签
说起
Html的
标签有点React组件的味道,我们就从它开始学习React。
以下是一个有几个
子元素的
,对于类似于这样的HTML标签,相信大家都已经非常熟悉。
Volvo
Saab
Mercedes
Audi
浏览器渲染上面的元素树时会产生一个包含一系列项目的文字列表.
在JSFiddle中查看详情
此时浏览器,DOM,shadowDOM一起把
标签渲染为UI组件。
是下拉列表,当用户点击其内的某一选项时,该选项会被选中,之所以被选中,是因为选中的状态被存储了(比如说,当你点击“Volvo”时,这个会被选中,而"Mercedes"的选中状态会被取消)。
使用React,我们可以做类似的事情,不过此时我们是使用React nodes 构成React组件 ,当然最终渲染后其还是被转化为了HTML DOM中的HTMl 元素。
下面我们使用React来模仿
创建一个下拉列表。
定义第一个React组件
我使用React.createClass
函数创建一个叫做MySelect
的组件。通过下面的代码你可以看出MySelect
组件由一些样式和一个空的React 节点组成。
var MySelect = React.createClass({ //定义MySelect组件
render: function(){
var mySelectStyle = {
border: '1px solid #999',
display: 'inline-block',
padding: '5px'
};
// {}使得在JSX中可以书写JS代码
return
; //这是一个React节点
}
});
例子中的很像HTML里的标签,不过它存在于JavaScript代码中,这种形式被称作JSX,JSX是一个可选的JavaScript语法拓展,它被React用来表示React nodes,其和真实渲染而成的DOM中的HTML有一定的映射关系,不过二者并非一一对应,它们之间存在一些差别(参看这里和这里)。
JSX语法必须被转化为JavaScript语句才能被浏览器的 JS引擎理解并执行,上述代码如果没有被转化,执行时会报错。
React官方供的转换JSX为ES5语句的工具叫做Babel。
上面的JSX语法中的通过Babel转换之后看起来是下面这样的
// 转换前
return
;
//转换后
return React.createElement('div', { style: mySelectStyle });
到目前为止,你需要记住的是,当你写了类似于HTML标签的React语句时,其实最终它都会通过Babel被转换为ES5语句,目前React中的ES6语句也同样会被转化为ES5的语句。
现在我们的
组件中只包含了一个空的React节点,这其实没什么意思,让我们来进一步完善它。
我接下来将定义一个名为
的组件,并将把这个组件当做
的子组件置于其中。以下是定义这两个组件的代码
var MySelect = React.createClass({
render: function(){
var mySelectStyle = {
border: '1px solid #999',
display: 'inline-block',
padding: '5px'
};
return ( //下面的JSX语句中,一个组件包含有另外一个组件
);
}
});
var MyOption = React.createClass({ //定义MyOption组件
render: function(){
return {this.props.value}
; //react div element, via JSX
}
});
上面的代码,让我们对
组件如何置于
组件之中,JSX如何使用有了进一步的了解。
使用React的属性(props) 为组件传递参数
观察上述代码 你可以看出
组件由一个React节点和表达式
{this.props.value}
组成,JSX中的
{}
意味着一段JavaScript语句将被执行,也就是说,你可以在
{}
之中书写JavaScript 语句。
{}
大括号使得该位置有获取组件传递的属性或参数的权限(此处的{this.props.value}
)。当组件被渲染时,传递来的类似于HTML属性的参数将会被放置在该位置,本例中value = volve
将会被放置在该React 节点中。这些类似于HTML属性的参数被称作
React属性(props) ,React使用它们传递无状态的或不可变的参数到组件之中。此例中,我们简单的把
value
属性通过props传入
组件,这很类似向一个函数中传递参数(实际上JSX在幕后就是这么做的)。
组件的渲染过程:先被渲染为Virtual DOM,再被渲染为HTML DOM
到目前为止,我们仅仅只是定义了两个React组件,还并没有把它们渲染为Virtual DOM 更别说HTML DOM了。
我想强调的是,这两个React组件是由JavaScript定义的,理论上我们定义的是两个UI组件,它并不一定需要转换为DOM或者Virtual DOM,这个UI组件在理论上可以被渲染为Native mobile platorm上或者HTML canvas中,但是我在这里不打算细说这个,我想强调的是React是一个组织UI组件的平台,它是超越DOM,前端应用甚至Web平台的存在。
下面我们把
渲染为Virtual DOM,当然其最终会转化为HTML页面里的真实的DOM。
在下面的JavaScript代码中,我在最后一行添加了 ReactDOM.render()
函数,观察代码可以看出这个函数有两个参数,一是我打算渲染的组件,而是我想把组件渲染的位置(
这是一个已经存在的DOM节点)。你可以通过点击Result按钮查看渲染结果,你会发现
组件已经被渲染进了HTML DOM中。
点击JSFiddle查看更多
你也许已经注意到,我只是告诉React渲染那个组件,渲染到何处,React会自动渲染该组件内的子组件
。
在继续讲下一个知识点前,我们回想一下刚刚发生了什么,我们并没有直接操作DOM使得
组件转换为真实的DOM,或者说并没有使用类似于jQuery那样的代码直接操作DOM。在React中对真实DOM的一切操作都被抽象为了操作Virtual DOM。实际上,使用React,你需要做的就是描述你想要的Virtual DOM,至于如何把它装换为真实DOM,React都替你做好了。
使用React state
为了让
组件更进一步模仿
标签的功能,我们需要在为其添加state。毕竟保存选中某子元素的状态,是
的主要功能之一。
React中的 state
一个常见的用法就是用来表现组件的不同表观,以
组件为例来说,当某个子组件被选中时,或者是没有被选中的子组件时,其对外的表观应该是不同的,而这种变化在React中就是受state
影响的。
state
的改变通常是由事件(鼠标事件,键盘事件等等)或者网络事件(AJAX)所触发,state
同时也决定了UI何时需要被重新渲染(state改变一般就伴随着重新渲染)。
state
属性一般存在于构成UI组件的最顶层组件中。使用React提供的getInitialState()
方法我们可以设置 state
的默认值,就
组件来说,我们设置 return{selected:false}
表示没有文本被选中。这里提醒一句,getInitialState()
方法在组件被挂载前被触发,且在其整个生命周期里只会被触发一次。其返回的值会被作为this.state
的初始化值。
基于上面的描述,修改
组件的代码如下
var MySelect = React.createClass({
getInitialState: function(){ //在此添加selected状态的默认值为false
return {selected: false}; //this.state.selected = false;
},
render: function(){
var mySelectStyle = {
border: '1px solid #999',
display: 'inline-block',
padding: '5px'
};
return (
);
}
});
var MyOption = React.createClass({
render: function(){
return {this.props.value}
;
}
});
ReactDOM.render( , document.getElementById('app'));
基于上面的设置,接下我我将添加一个回调函数,这个函数的作用是当点击一个
时,会使得select
状态的值被更改。在该函数中,我还将获得option中的文本值(通过event
参数)。并以此来展示如何在当前组件上setState
。这里我使用的是通过事件来调用回调函数,如果你熟悉jQuery,对此你一定也不会陌生。
var MySelect = React.createClass({
getInitialState: function(){
return {selected: false};
},
select:function(event){// added select function
if(event.target.textContent === this.state.selected){//remove selection
this.setState({selected: false}); //update state
}else{//add selection
this.setState({selected: event.target.textContent}); //update state
}
},
render: function(){
var mySelectStyle = {
border: '1px solid #999',
display: 'inline-block',
padding: '5px'
};
return (
);
}
});
var MyOption = React.createClass({
render: function(){
return {this.props.value}
;
}
});
ReactDOM.render( , document.getElementById('app'));
为了使
组件可以调用select
函数,我们还必须把此函数传递给该组件,此时就用到props
了,要让该函数从
组件传递给
组件,我们要做两件事情,一是我们需要在
组件里的
组件上添加select={this.select}
。二是需要在
组件的节点上添加
onClick={this.props.select}
。这样做很直观的,我们在想要点击的位置绑定上了
click
事件,使得其可以调用
函数。添加事件的方法类似于你在真实DOM中添加事件的方法,React考虑到了你的使用习惯。
var MySelect = React.createClass({
getInitialState: function(){
return {selected: false};
},
select:function(event){
if(event.target.textContent === this.state.selected){
this.setState({selected: false});
}else{
this.setState({selected: event.target.textContent});
}
},
render: function(){
var mySelectStyle = {
border: '1px solid #999',
display: 'inline-block',
padding: '5px'
};
return (//使用props把函数当做参数传递给
);
}
});
var MyOption = React.createClass({
render: function(){//add event handler that will invoke select callback
return {this.props.value}
;
}
});
ReactDOM.render( , document.getElementById('app'));
现在,我们已经可以通过点击某一个
组件达到选中该组件的效果了。我们来想想,点击的过程发生了什么,当你点击某一个
时,select
函数会被触发,并且设定了
组件中state
的值,不过遗憾的是,现在我们的点击并没有明显的反馈,接下来让我们加上反馈。
我想达到的效果是,当我们把当前状态传递给
组件,可以得到视觉上的反馈,让我们知道组件的state
改变了。
再次使用props
,这次我们将把selected
状态通过父组件
传递给子组件
,我们通过在父组件中的所有
上设置state={this.state.selected}
来达到这个效果,观察代码我们知道如果
this.props.state
和当前值this.props.value
匹配,该子组件就会被选中。如果被选中,给该子组件添加selectedStyle
类名,如果没选中,则添加unSelectedStyle
类名。
点击在JSFiddle中查看
点击上面的例子,我们可以看到设置已经生效了。
虽然我们的React Select组件还没有完完全全的实现HTML
的功能,不过我觉得你肯定慢慢对React是如何工作的有了一定的了解了。React就是这样一个帮你构建组件树的工具,这棵树能让你的思路清晰,构建明白,贫富状态组件管理合理。
再继续论述virtual DOM之前,我想说明的是在React中,JSX和Babel并非是一定需要使用的。通过写纯粹的JavaScript代码也可以很好的使用React。下面是JSX通过Babel转换后的代码,如果你选择不使用JSX,你需要写下面这样的代码。
var MySelect = React.createClass({
displayName: 'MySelect',
getInitialState: function getInitialState() {
return { selected: false };
},
select: function select(event) {
if (event.target.textContent === this.state.selected) {
this.setState({ selected: false });
} else {
this.setState({ selected: event.target.textContent });
}
},
render: function render() {
var mySelectStyle = {
border: '1px solid #999',
display: 'inline-block',
padding: '5px'
};
return React.createElement(
'div',
{ style: mySelectStyle },
React.createElement(MyOption, { state: this.state.selected, select: this.select, value: 'Volvo' }),
React.createElement(MyOption, { state: this.state.selected, select: this.select, value: 'Saab' }),
React.createElement(MyOption, { state: this.state.selected, select: this.select, value: 'Mercedes' }),
React.createElement(MyOption, { state: this.state.selected, select: this.select, value: 'Audi' })
);
}
});
var MyOption = React.createClass({
displayName: 'MyOption',
render: function render() {
var selectedStyle = { backgroundColor: 'red', color: '#fff', cursor: 'pointer' };
var unSelectedStyle = { cursor: 'pointer' };
if (this.props.value === this.props.state) {
return React.createElement(
'div',
{ style: selectedStyle, onClick: this.props.select },
this.props.value
);
} else {
return React.createElement(
'div',
{ style: unSelectedStyle, onClick: this.props.select },
this.props.value
);
}
}
});
ReactDOM.render(React.createElement(MySelect, null), document.getElementById('app'));
理解Virtual DOM的作用
我将以简要介绍Virtual DOM来结束我们的React初探之旅,我将主要谈谈Virtual DOM为我们带来了什么。
你可能已经注意到,在全文中我们只有一个地方的代码涉及到了真实DOM,是在使用ReactDOM.render()
方法的时候。使用的目的是把我们的组件插入到了HTML页面中
。在今后React的使用过程中,这个可能也是唯一的一个你需要和真实DOM打交道的地方。这让我们在使用React的过程中,完全不用像以前使用jQuery那样考虑DOM了,通过DOM抽象,React可以说完全取代了jQuery,移除了对绝大多数对具体DOM的操作,使得前端的效能大大提升。
Virtual DOM是对真实DOM的抽象,这使得一些重操作成为可能。Virtual DOM依据state
和props
检测UI的改变,然后与当前的真实DOM进行比较,只做最小的改变来更新UI以达到我们想要的表现。换句话说当state
和props
改变时,真实的DOM并没有被重新渲染而是只是打了小的补丁。
下面的动画,能让你对此理解得更加深刻。
也许你已经发现,当状态改变时真实DOM中只有很小的部分需要被改变。真正被改变的地方只有图中有绿色轮廓的地方,整个组件并没有在每次改变state
时都刷新,React使得只有需要改变的地方被改变。
我想澄清一下,Virtual DOM并非什么革命性的理念。一个聪明的人利用jQuery使用精巧的技法也可以实现类似的效果。然而,通过使用React,你完全不用去管它了,Virtual DOM为你做了所有涉及渲染方面的工作,通过对真实DOM进行抽象,我们根本不需要再担心DOM或者编写代码直接操作DOM了。
到此,我们的React初探部分就要结束了,当我们再来回顾一下,React使得我们不再需要类似于jQuery之类的工具了。比起jQuery,Virtual DOM在很多方便都优异的多。当然React所拥有的并不只是Virtual DOM,这其实是其冰山一角。React最大的价值可能在于它提供了一种简单可维护的模式用以构建UI组件,想象一下通过使用可复用的组件来构建你的应用,这是多么美好的事情啊。
链接
原文链接 本文在GitBook上的链接
希望本文让你有所收获,欢迎大家随意提出自己的意见。
你可能感兴趣的:((React启蒙)初探React)
19.0-《超越感觉》-说服他人
SAM52
Becausethoughtfuljudgmentsdeservetobeshared,andthewaytheyarepresentedcanstronglyinfluencethewayothersreacttothem.因为经过深思熟虑的判断值得分享,而这些判断的呈现方式会强烈影响其他人对它们的反应。Bylearningtheprinciplesofpersuasionandapplying
初探数学思维(一):数学概括
JackyFuu
数学培养规则意识;培养周密思维和创新能力“现代电子计算机之父”冯·诺依曼对微积分的评价:微积分是现代数学的第一个成就,而且怎样评价它的重要性都不为过。我认为,微积分比其他任何事物都更清楚地表明了现代数学的发端;而且,作为其逻辑发展的数学分析体系仍然构成了精密思维中最伟大的技术进展。《GEB-一条永恒的金带》,普利策奖,1979,美国,指出有一条永恒的金带把数理逻辑、绘画、音乐等不同领域之间的共同规
全面解析:Spring Gateway如何优雅处理微服务的路由转发?
万猫学社
gateway java spring
SpringGateway简介SpringGateway,这是一个基于Spring5、SpringBoot2和ProjectReactor的API网关。它旨在为微服务架构提供一个简单、有效的统一的API路由、限流、熔断等功能。在微服务的世界里,SpringGateway就像一个交通警察,负责指挥和引导各个微服务之间的交通。相较于其他的网关技术,比如Nginx、Zuul等,SpringGateway
从零到一:打造基于GigaChat AI的艺术创作平台 | 笙囧同学的全栈开发实战
作者简介:笙囧同学,中科院计算机大模型方向硕士,全栈开发爱好者联系方式:
[email protected] 各大平台账号:笙囧同学座右铭:偷懒是人生进步的阶梯前言在AI技术飞速发展的今天,如何将前沿的大模型技术与实际应用相结合,一直是我们开发者关注的焦点。今天,笙囧同学将带大家从零开始,构建一个基于GigaChatAI的艺术创作平台,实现React前端+Django后端的完整全栈解决方案。这不仅仅是
鼎典书画|小雏菊
鼎典美育梦鑫
一【班级】启蒙认知班二【代课老师】梦鑫老师三【年龄阶段】4-6岁四【课程主题】《小雏菊》五【完成课时】《一节课》六【课程准备】卡纸,画笔,丙烯等材料七【课程重、难点】重点:小雏菊的造型,花朵大小的对比难点:小雏菊的花瓣塑造八[课程步骤]1.引导:通过视频导入,引导孩子来猜这个花的名称,询问孩子是否见过?引出我们的主题-太阳花(雏菊),长得像太阳的小雏菊。2.过程:带领孩子去了解小雏菊的生长习性,其
难忘的一课
5fc31ee863cb
百善孝为先,这是我常对孩子们说的话。因为,在独生子的年代,大多数的家庭都把孩子当皇子。经济条件的优裕,长辈们的宠溺,促使孩子们养成了一切以自我为中心的德性。因此,我们一线老师常常听到家长诉苦:我的孩子犟,不听话。我的孩子爱发脾气。我的孩子独霸,不懂得体贴。甚至于有的家长极端地说:家中他是老子,天皇老子!我是儿子。这确实是个问题。面对这状况,除了家长,作为启蒙老师的我,如何培养孩子孝顺长辈的美德,是
《长颈鹿》
鼎典美育宋铭
一【班级】《启蒙认知班》二【代课老师】铭铭老师三【年龄阶段】3.5~5四活动目标:1.知识与技能:通过春天万物复苏,鲜花争相开放,引出丛林中的小动物—长颈鹿2.过程与方法:通过老师讲述长颈鹿的特点,引导儿童猜测小动物的形态,激发幼儿对课堂内容的兴趣,简单了解本堂课的内容,通过各种绘画形式去完成本堂课内容。3.情感态度与价值观:养成观察事物的能力和想象能力,懂得分享和交流。五材料准备:白色卡纸,彩色
诵读经典感恩日志
瑜昊妈
陪伴宝贝学习圣经典感恩日志,第456篇2018年4月7,星期日读经人:瑜昊妈,瑜宝,昊宝读经内容:两个宝贝共读,《少年儿童诗词启蒙》--《秋日湖上》(91--100)《庄子》大宗师第六(1)《黄帝内经》平人气象论篇十八(2)图片发自App瑜昊宝新概念英语:第一册第1课,第7课,第9课第7天,累计第7天读经方法:147妈妈诵读:《道德经》8遍妈妈通读《易经》100遍《孝经》58遍《增广贤文》4遍昊宝
Vue3组合API初体验
DTcode7
Vue实战指南 VUE HTML web vue框架 前端
Vue3组合API初体验基本概念与作用说明示例一:使用ref创建响应式数据示例二:使用reactive创建响应式对象示例三:使用computed计算属性示例四:使用watch监听数据变化示例五:使用provide/inject进行父子组件间通信功能使用思路与实际开发技巧1.何时使用ref与reactive?2.如何在组合式API中保持逻辑的清晰?3.如何处理异步操作?随着Vue3的发布,组合式AP
第七篇 快速开始-序
深圳都这么冷
快速开始欢迎使用React文档!本页将向您介绍您每天会用到的80%的React概念。本章内容预告如何创建和嵌套组件如何添加标记和样式如何显示数据如何渲染条件表达式和列表表达式如何响应事件和更新屏幕如何在组件之间共享数据创建和嵌套组件React应用程序由组件组成。组件是UI(用户界面)的一部分,具有自己的逻辑和外观。组件可以小到一个按钮,也可以大到整个页面。React组件是返回标记的JavaScri
maven指定子项目打包
Maven多个mudule只编译、打包指定module在多module的maven项目中,如果每次打包整个工程显得有些冗余和笨重。例如A,B,P的继承关系为P|—–A|—–B即P包含A,B的module,每次打包P都会将A,B都打包。假如我只修改了A模块,那么每次都要将B都一块打包吗?当然不是,maven提供了自定义参数:-pl,--projectsBuildspecifiedreactorpro
React组件中的this指向问题
在React组件中,函数定义方式影响this指向的核心原因是箭头函数与普通函数的作用域绑定规则不同,具体差异如下:1.普通函数(function定义)需要手动bind(this)的原因当用function在组件内定义方法时:classMyComponentextendsReact.Component{handleClick(){console.log(this);//若未绑定,此处this为und
和同事聊育儿、英语启蒙
greenorchid
2019年11月22日,和同事一起出行,在车上至少聊了有6个小时,从八卦新闻,到家长里短,从教学工作到育儿,尤其是育儿最多。最大的感慨是:别人怎么这么用心地陪伴孩子啊!和她相比,我是远远不如,深感愧疚!她为孩子付费购买各种分级读物、绘本,在线课程。1每天使用伴鱼绘本给孩子读绘本,已经读了150多天了。一年3、400多元,打卡300天左右,就能归还学费。2自己先学习鹅妈妈童谣集,自己跟着学唱10多遍
Rust 全栈应用框架 Dioxus:从前端到桌面再到 WASM 的统一开发体验
掘金安东尼
字节 阿里 rust 前端 wasm
如果你正在寻找一个能用Rust写前端、桌面应用、移动应用甚至WebAssembly的统一框架,Dioxus是目前生态中最具潜力的选择之一。为什么需要Dioxus?随着WebAssembly(WASM)与Rust的发展,越来越多开发者开始思考:Rust是否能做“全栈”?是否能有像React一样的组件模型?是否可以用Rust写桌面GUI,甚至Web前端?Dioxus正是这个愿景下的产物。它是一个受Re
IntelliJ IDEA 高效开发指南:从基础操作到高级技巧
zqmgx13291
intellij-idea java ide
一、IDEA概述与环境配置1.1IDEA的核心优势智能代码辅助:基于上下文的代码补全(Ctrl+Space)、方法参数提示、错误实时检测全栈开发支持:内置Java/Python/JavaScript等20+语言支持,框架集成(SpringBoot/Vue/React)工具链集成:版本控制(Git/SVN)、数据库(MySQL/PostgreSQL)、容器(Docker/K8s)一站式开发性能优化:
2023-10-20
咸鱼日记
Hi,早上好,今天有点降温了,没有太阳,但是心里住着一个太阳。今天我想聊聊【孩子英语启蒙】这件事在孩子两岁的时候,我就开始有了做启蒙的想法,选择了有外教的早教机构,一呆就是两年;后来进入幼儿园,我给他报了一些线上线下的英语机构,一周从两节课,增加到了4节课,一年下来,要说学会了多少单词,那是不少了,一节课一个来计算,也有好几百个单词会说了,但是口语不行,依然无法开口交流。三年来,对于金钱上的投入,
早.好习惯 成长体验营第二期打卡Day4《给孩子的商业启蒙》分享10-13章内容
文静育儿读书
第10章1.万维刚的《精英日课》卓克的《科学思维课》爱好本身就是用处,人应该有自己的爱好,不一定非要给爱好找一个公立的用处2.不要因为副产品影响主里有主里有就是爱好,爱好本身就是用处。爱好会让你开心,喜欢觉得放松就足够了。复盘:好多人觉得孩子跳舞又不考专业,还学浪费时间,可是我并不觉得,我觉得跳舞本身就很有意义,既锻炼身体又能缓解压力!一个人总要有一件自己喜欢做的事,这样生活才会丰富多彩,才会给自
react class和function 如何模拟vue中的 双向绑定 监听 computed的方式
在React中,类组件和函数组件的写法有所不同。你提到的「双向绑定」、「监听」和「computed(计算属性)」这几个概念,原本来源于Vue,但在React中我们也可以通过特定方式实现类似功能。下面我将分别介绍:1.类组件中的双向绑定在类组件中,要实现双向绑定(如表单输入),我们通常使用state和onChange:importReactfrom'react';classMyFormextends
PostGIS面试题及详细答案120道之 (021-030 )
还是大剑师兰特
大剑师 postgis面试题
《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux…。前后端面试题-专栏总目录文章目录一、本文面试题目录21.为什么要在PostGIS中使用空间索引?22.PostGIS支持哪些类型的
Java面试题及详细答案120道之(081-100)
还是大剑师兰特
前后端面试题 大剑师 java面试题
《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux…。前后端面试题-专栏总目录文章目录一、本文面试题目录81.Java中的`ConcurrentHashMap`与`HashMap`在并
Openlayers 面试题及答案180道(41-60)
还是大剑师兰特
# 前后端面试题 大剑师 Openlayers面试题 Openlayers示例 Openlayers教程
《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux…。前后端面试题-专栏总目录文章目录一、本文面试题目录41.如何在OpenLayers中加载WFS数据?42.在OpenLayers中
CSS面试题及详细答案140道之(41-60)
还是大剑师兰特
前后端面试题 css 前端 大剑师 CSS面试 CSS示例
《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux…。前后端面试题-专栏总目录文章目录一、本文面试题目录41.如何在不使用额外标记的情况下隐藏文本但保留其可访问性?42.解释`text
2025年02月13日 · Go生态洞察:可扩展的 WebAssembly 应用
猫头虎
# Go生态洞察 golang wasm 开发语言 后端 go1.19 go beego
2025年02月13日·Go生态洞察:可扩展的WebAssembly应用摘要大家好,我是猫头虎。本篇文章将带领大家深入剖析Go1.24在WebAssembly(Wasm)领域的最新特性:go:wasmexport指令、WASIReactor构建模式、丰富类型支持及其限制,并通过示例代码演示如何在实际项目中灵活运用。关键词:WebAssembly、WASI、Go1.24、go:wasmexport、
每天一个前端小知识 Day 17 - 微前端架构实战与 Module Federation
微前端架构实战与ModuleFederation为什么要微前端?✅传统SPA的问题:问题描述构建时间越来越长单体应用构建缓慢,难以增量部署多团队协作困难不同业务线互相依赖紧耦合技术栈难以迁移老项目技术债,无法局部替换✅微前端目标:像微服务一样拆前端系统各子应用独立开发、独立部署、独立运行支持多技术栈共存(React+Vue+原生)核心架构方案一览架构方式技术实现适用场景iframe方式每个子应用独
Python魔法入门:Python,你的编程启蒙导师
第一篇:Python,你的编程启蒙导师引言Python的自我介绍轻松安装Python环境print函数:编程的起点结语引言欢迎踏入编程的奇幻之旅,今天我们将一起遇见你的编程启蒙导师——Python。这门语言不仅以其简洁优雅的语法著称,更以其广泛的应用领域和强大的社区支持赢得了全球开发者的青睐。在正式启程之前,让我们先一起了解一下Python的发展历史,并深入剖析一下那个看似简单却充满魔力的prin
你的一个箭头函数让我找了几天
JsLin_
同事的h5的相关内容给我接手了,上线后发现好多手机浏览器不显示内容,就是这个问题断断续续找了有两个星期的时间,迫使我把他的h5相关的内容用react重构了一遍,重构完又发现一大堆事情。先抱怨下吧首先,一个网站的域名竟然不指定首页?大图片资源不压缩?找了一段时间,没找到原因,迫使我把它的代码用react重构了,也正好练练手。重构完了之后,发现运维那里的以前的工程nginx部署没有指定主页,才发现官网
【绮罗幽香】20180328践行D158
幽香_5126
早上起床,奶奶问我们吃饺子,行不行!结果儿子问,妈妈你吃几个?奶奶你吃几个?然后再加上自己要吃的,去画了圈圈,统计了下总共多少,然后告诉奶奶下多少个饺子!很久之前吃饺子,让他统计过,没想到他喜欢上了这样的方式,每次吃饺子都是他统计!今天我病倒了,下班到家就躺下了,儿子自己各种践行!starfall玩了15分钟。读语言启蒙很多篇。这一年到头也只有今天没有给宝宝读书。宝宝很乖的一直陪着我!图片发自Ap
2023-05-26
程艺0428
语文字词:紧跟课内、提前预习、买对教辅、千万不能马虎。要求高点,二类字当一类字提前学和写,到中高年级不吃亏。教辅:默写小达人、默写能手。(血的教训:字词句一定要在家搞好我们的语文老师已经特别好了我以前就是一味拔高没有好好配合老师很后悔)古文路径:小学必备古诗词~小古文100课(文言启蒙课)~红宝书(书名是《中华古诗文诵读》)。背完前两个已经算是文言入门了。刷进度的可以背初中必备。愿意死磕的背红宝书
面试复盘:为什么Vue2的data数据量大时内存开销大?
neon1204
前端面试 面试 前端 javascript vue.js
背景描述今天前端技术面试中,面试官针对Vue2的源码和性能方面提问:“当data中存储大量数据时,为什么内存开销显著增加?”。本文复盘梳理我的回答思路:一、核心机制:Object.defineProperty的递归与闭包Vue2的响应式系统通过递归遍历data中的每个属性,将其转换为getter/setter。这一过程在源码中由defineReactive函数实现,其内存开销主要来自以下三点:1.
IOS —— Runloop 初识随笔
banlong6430
在写这篇文章之前,对IOS中Runloop这概念的认知基本约等于0。从字面上的意思来了解,就是一个死循环的意思直到我在网上看到这样一篇文章《深入了解Runloop》,初次阅读发现自己几乎无法理解文章中大部分词汇以及运作原理,直至反反复复阅读2~3遍才初探端倪以下这篇文章,是通过自身略带抽象的思维方式结合自己的理解(或许也有问题),简述及整理上述的runloop文章。1.什么是RUNLOOPRunl
数据采集高并发的架构应用
3golden
.net
问题的出发点:
最近公司为了发展需要,要扩大对用户的信息采集,每个用户的采集量估计约2W。如果用户量增加的话,将会大量照成采集量成3W倍的增长,但是又要满足日常业务需要,特别是指令要及时得到响应的频率次数远大于预期。
&n
不停止 MySQL 服务增加从库的两种方式
brotherlamp
linux linux视频 linux资料 linux教程 linux自学
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库。前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作。
一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabacku
Quartz——SimpleTrigger触发器
eksliang
SimpleTrigger TriggerUtils quartz
转载请出自出处:http://eksliang.iteye.com/blog/2208166 一.概述
SimpleTrigger触发器,当且仅需触发一次或者以固定时间间隔周期触发执行;
二.SimpleTrigger的构造函数
SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称;
Simpl
Informatica应用(1)
18289753290
sql workflow lookup 组件 Informatica
1.如果要在workflow中调用shell脚本有一个command组件,在里面设置shell的路径;调度wf可以右键出现schedule,现在用的是HP的tidal调度wf的执行。
2.designer里面的router类似于SSIS中的broadcast(多播组件);Reset_Workflow_Var:参数重置 (比如说我这个参数初始是1在workflow跑得过程中变成了3我要在结束时还要
python 获取图片验证码中文字
酷的飞上天空
python
根据现成的开源项目 http://code.google.com/p/pytesser/改写
在window上用easy_install安装不上 看了下源码发现代码很少 于是就想自己改写一下
添加支持网络图片的直接解析
#coding:utf-8
#import sys
#reload(sys)
#sys.s
AJAX
永夜-极光
Ajax
1.AJAX功能:动态更新页面,减少流量消耗,减轻服务器负担
2.代码结构:
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
.... AJAX script goes here ...
创业OR读研
随便小屋
创业
现在研一,有种想创业的想法,不知道该不该去实施。因为对于的我情况这两者是矛盾的,可能就是鱼与熊掌不能兼得。
研一的生活刚刚过去两个月,我们学校主要的是
需求做得好与坏直接关系着程序员生活质量
aijuans
IT 生活
这个故事还得从去年换工作的事情说起,由于自己不太喜欢第一家公司的环境我选择了换一份工作。去年九月份我入职现在的这家公司,专门从事金融业内软件的开发。十一月份我们整个项目组前往北京做现场开发,从此苦逼的日子开始了。
系统背景:五月份就有同事前往甲方了解需求一直到6月份,后续几个月也完
如何定义和区分高级软件开发工程师
aoyouzi
在软件开发领域,高级开发工程师通常是指那些编写代码超过 3 年的人。这些人可能会被放到领导的位置,但经常会产生非常糟糕的结果。Matt Briggs 是一名高级开发工程师兼 Scrum 管理员。他认为,单纯使用年限来划分开发人员存在问题,两个同样具有 10 年开发经验的开发人员可能大不相同。近日,他发表了一篇博文,根据开发者所能发挥的作用划分软件开发工程师的成长阶段。
初
Servlet的请求与响应
百合不是茶
servlet get提交 java处理post提交
Servlet是tomcat中的一个重要组成,也是负责客户端和服务端的中介
1,Http的请求方式(get ,post);
客户端的请求一般都会都是Servlet来接受的,在接收之前怎么来确定是那种方式提交的,以及如何反馈,Servlet中有相应的方法, http的get方式 servlet就是都doGet(
web.xml配置详解之listener
bijian1013
java web.xml listener
一.定义
<listener>
<listen-class>com.myapp.MyListener</listen-class>
</listener>
二.作用 该元素用来注册一个监听器类。可以收到事件什么时候发生以及用什么作为响
Web页面性能优化(yahoo技术)
Bill_chen
JavaScript Ajax Web css Yahoo
1.尽可能的减少HTTP请求数 content
2.使用CDN server
3.添加Expires头(或者 Cache-control) server
4.Gzip 组件 server
5.把CSS样式放在页面的上方。 css
6.将脚本放在底部(包括内联的) javascript
7.避免在CSS中使用Expressions css
8.将javascript和css独立成外部文
【MongoDB学习笔记八】MongoDB游标、分页查询、查询结果排序
bit1129
mongodb
游标
游标,简单的说就是一个查询结果的指针。游标作为数据库的一个对象,使用它是包括
声明
打开
循环抓去一定数目的文档直到结果集中的所有文档已经抓取完
关闭游标
游标的基本用法,类似于JDBC的ResultSet(hasNext判断是否抓去完,next移动游标到下一条文档),在获取一个文档集时,可以提供一个类似JDBC的FetchSize
ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
白糖_
ORA-12514
今天通过Oracle SQL*Plus连接远端服务器的时候提示“监听程序当前无法识别连接描述符中请求服务”,遂在网上找到了解决方案:
①打开Oracle服务器安装目录\NETWORK\ADMIN\listener.ora文件,你会看到如下信息:
# listener.ora Network Configuration File: D:\database\Oracle\net
Eclipse 问题 A resource exists with a different case
bozch
eclipse
在使用Eclipse进行开发的时候,出现了如下的问题:
Description Resource Path Location TypeThe project was not built due to "A resource exists with a different case: '/SeenTaoImp_zhV2/bin/seentao'.&
编程之美-小飞的电梯调度算法
bylijinnan
编程之美
public class AptElevator {
/**
* 编程之美 小飞 电梯调度算法
* 在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。
* 所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。
* 在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
* 问:电梯停在哪
SQL注入相关概念
chenbowen00
sql Web 安全
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
首先让我们了解什么时候可能发生SQ
[光与电]光子信号战防御原理
comsci
原理
无论是在战场上,还是在后方,敌人都有可能用光子信号对人体进行控制和攻击,那么采取什么样的防御方法,最简单,最有效呢?
我们这里有几个山寨的办法,可能有些作用,大家如果有兴趣可以去实验一下
根据光
oracle 11g新特性:Pending Statistics
daizj
oracle dbms_stats
oracle 11g新特性:Pending Statistics 转
从11g开始,表与索引的统计信息收集完毕后,可以选择收集的统信息立即发布,也可以选择使新收集的统计信息处于pending状态,待确定处于pending状态的统计信息是安全的,再使处于pending状态的统计信息发布,这样就会避免一些因为收集统计信息立即发布而导致SQL执行计划走错的灾难。
在 11g 之前的版本中,D
快速理解RequireJs
dengkane
jquery requirejs
RequireJs已经流行很久了,我们在项目中也打算使用它。它提供了以下功能:
声明不同js文件之间的依赖
可以按需、并行、延时载入js库
可以让我们的代码以模块化的方式组织
初看起来并不复杂。 在html中引入requirejs
在HTML中,添加这样的 <script> 标签:
<script src="/path/to
C语言学习四流程控制if条件选择、for循环和强制类型转换
dcj3sjt126com
c
# include <stdio.h>
int main(void)
{
int i, j;
scanf("%d %d", &i, &j);
if (i > j)
printf("i大于j\n");
else
printf("i小于j\n");
retu
dictionary的使用要注意
dcj3sjt126com
IO
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
user.user_id , @"id",
user.username , @"username",
Android 中的资源访问(Resource)
finally_m
xml android String drawable color
简单的说,Android中的资源是指非代码部分。例如,在我们的Android程序中要使用一些图片来设置界面,要使用一些音频文件来设置铃声,要使用一些动画来显示特效,要使用一些字符串来显示提示信息。那么,这些图片、音频、动画和字符串等叫做Android中的资源文件。
在Eclipse创建的工程中,我们可以看到res和assets两个文件夹,是用来保存资源文件的,在assets中保存的一般是原生
Spring使用Cache、整合Ehcache
234390216
spring cache ehcache @Cacheable
Spring使用Cache
从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的
当druid遇上oracle blob(clob)
jackyrong
oracle
http://blog.csdn.net/renfufei/article/details/44887371
众所周知,Oracle有很多坑, 所以才有了去IOE。
在使用Druid做数据库连接池后,其实偶尔也会碰到小坑,这就是使用开源项目所必须去填平的。【如果使用不开源的产品,那就不是坑,而是陷阱了,你都不知道怎么去填坑】
用Druid连接池,通过JDBC往Oracle数据库的
easyui datagrid pagination获得分页页码、总页数等信息
ldzyz007
var grid = $('#datagrid');
var options = grid.datagrid('getPager').data("pagination").options;
var curr = options.pageNumber;
var total = options.total;
var max =
浅析awk里的数组
nigelzeng
二维数组 array 数组 awk
awk绝对是文本处理中的神器,它本身也是一门编程语言,还有许多功能本人没有使用到。这篇文章就单单针对awk里的数组来进行讨论,如何利用数组来帮助完成文本分析。
有这么一组数据:
abcd,91#31#2012-12-31 11:24:00
case_a,136#19#2012-12-31 11:24:00
case_a,136#23#2012-12-31 1
搭建 CentOS 6 服务器(6) - TigerVNC
rensanning
centos
安装GNOME桌面环境
# yum groupinstall "X Window System" "Desktop"
安装TigerVNC
# yum -y install tigervnc-server tigervnc
启动VNC服务
# /etc/init.d/vncserver restart
# vncser
Spring 数据库连接整理
tomcat_oracle
spring bean jdbc
1、数据库连接jdbc.properties配置详解 jdbc.url=jdbc:hsqldb:hsql://localhost/xdb jdbc.username=sa jdbc.password= jdbc.driver=不同的数据库厂商驱动,此处不一一列举 接下来,详细配置代码如下:
Spring连接池  
Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
xp9802
用Dom4J解析xml,以前没注意,今天使用dom4j包解析xml时在xpath使用处报错
异常栈:java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
导入包 jaxen-1.1-beta-6.jar 解决;
&nb