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

口碑好的坪山网站建设做网站的的价格

口碑好的坪山网站建设,做网站的的价格,潮州市建设工程交易中心网站,群晖套件做网站React 组件中怎么做事件代理#xff1f;它的原理是什么#xff1f; React基于Virtual DOM实现了一个SyntheticEvent层#xff08;合成事件层#xff09;#xff0c;定义的事件处理器会接收到一个合成事件对象的实例#xff0c;它符合W3C标准#xff0c;且与原生的浏览器…React 组件中怎么做事件代理它的原理是什么 React基于Virtual DOM实现了一个SyntheticEvent层合成事件层定义的事件处理器会接收到一个合成事件对象的实例它符合W3C标准且与原生的浏览器事件拥有同样的接口支持冒泡机制所有的事件都自动绑定在最外层上。 在React底层主要对合成事件做了两件事 事件委派 React会把所有的事件绑定到结构的最外层使用统一的事件监听器这个事件监听器上维持了一个映射来保存所有组件内部事件监听和处理函数。自动绑定 React组件中每个方法的上下文都会指向该组件的实例即自动绑定this为当前组件。 如何有条件地向 React 组件添加属性 对于某些属性React 非常聪明如果传递给它的值是虚值可以省略该属性。例如 var InputComponent React.createClass({render: function () {var required true;var disabled false;return input typetext disabled{disabled} required{required} /;}, });渲染结果 input typetext required另一种可能的方法是 var condition true; var component div valuefoo {...(condition { disabled: true })} /;react 的渲染过程中兄弟节点之间是怎么处理的也就是key值不一样的时候 通常我们输出节点的时候都是map一个数组然后返回一个ReactNode为了方便react内部进行优化我们必须给每一个reactNode添加key这个key prop在设计值处不是给开发者用的而是给react用的大概的作用就是给每一个reactNode添加一个身份标识方便react进行识别在重渲染过程中如果key一样若组件属性有所变化则react只更新组件对应的属性没有变化则不更新如果key不一样则react先销毁该组件然后重新创建该组件 如何用 React构建 build生产模式 通常使用 Webpack的 DefinePlugin方法将 NODE ENV设置为 production。这将剥离 propType验证和额外的警告。除此之外还可以减少代码因为 React使用 Uglify的dead-code来消除开发代码和注释这将大大减少包占用的空间。 在 React中元素 element和组件 component有什么区别 简单地说在 React中元素虛拟DOM描述了你在屏幕上看到的DOM元素。 换个说法就是在 React中元素是页面中DOM元素的对象表示方式。在 React中组件是一个函数或一个类它可以接受输入并返回一个元素。 注意工作中为了提高开发效率通常使用JSX语法表示 React元素虚拟DOM。在编译的时候把它转化成一个 React. createElement调用方法。 react旧版生命周期函数 初始化阶段 getDefaultProps:获取实例的默认属性getInitialState:获取每个实例的初始化状态componentWillMount组件即将被装载、渲染到页面上render:组件在这里生成虚拟的DOM节点componentDidMount:组件真正在被装载之后 运行中状态 componentWillReceiveProps:组件将要接收到属性的时候调用shouldComponentUpdate:组件接受到新属性或者新状态的时候可以返回false接收数据后不更新阻止render调用后面的函数不会被继续执行了componentWillUpdate:组件即将更新不能修改属性和状态render:组件重新描绘componentDidUpdate:组件已经更新 销毁阶段 componentWillUnmount:组件即将销毁 参考 前端进阶面试题详细解答 diff算法是怎么运作 每一种节点类型有自己的属性也就是prop每次进行diff的时候react会先比较该节点类型假如节点类型不一样那么react会直接删除该节点然后直接创建新的节点插入到其中假如节点类型一样那么会比较prop是否有更新假如有prop不一样那么react会判定该节点有更新那么重渲染该节点然后在对其子节点进行比较一层一层往下直到没有子节点 在 Redux中使用 Action要注意哪些问题 在Redux中使用 Action的时候 Action文件里尽量保持 Action文件的纯净传入什么数据就返回什么数据最妤把请求的数据和 Action方法分离开以保持 Action的纯净。 React中setState的第二个参数作用是什么 setState 的第二个参数是一个可选的回调函数。这个回调函数将在组件重新渲染后执行。等价于在 componentDidUpdate 生命周期内执行。通常建议使用 componentDidUpdate 来代替此方式。在这个回调函数中你可以拿到更新后 state 的值 this.setState({key1: newState1,key2: newState2,... }, callback) // 第二个参数是 state 更新完成后的回调函数 在生命周期中的哪一步你应该发起 AJAX 请求 我们应当将AJAX 请求放到 componentDidMount 函数中执行主要原因有下 React 下一代调和算法 Fiber 会通过开始或停止渲染的方式优化应用性能其会影响到 componentWillMount 的触发次数。对于 componentWillMount 这个生命周期函数的调用次数会变得不确定React 可能会多次频繁调用 componentWillMount。如果我们将 AJAX 请求放到 componentWillMount 函数中那么显而易见其会被触发多次自然也就不是好的选择。如果我们将AJAX 请求放置在生命周期的其他函数中我们并不能保证请求仅在组件挂载完毕后才会要求响应。如果我们的数据请求在组件挂载之前就完成并且调用了setState函数将数据添加到组件状态中对于未挂载的组件则会报错。而在 componentDidMount 函数中进行 AJAX 请求则能有效避免这个问题 React中的setState批量更新的过程是什么 调用 setState 时组件的 state 并不会立即改变 setState 只是把要修改的 state 放入一个队列 React 会优化真正的执行时机并出于性能原因会将 React 事件处理程序中的多次React 事件处理程序中的多次 setState 的状态修改合并成一次状态修改。 最终更新只产生一次组件及其子组件的重新渲染这对于大型应用程序中的性能提升至关重要。 this.setState({count: this.state.count 1 入队[count1的任务] }); this.setState({count: this.state.count 1 入队[count1的任务count1的任务] });↓合并 state[count1的任务]↓执行 count1的任务 需要注意的是只要同步代码还在执行“攒起来”这个动作就不会停止。注这里之所以多次 1 最终只有一次生效是因为在同一个方法中多次 setState 的合并动作不是单纯地将更新累加。比如这里对于相同属性的设置React 只会为其保留最后一次的更新。 Redux内部原理 内部怎么实现dispstch一个函数的 以redux-thunk中间件作为例子下面就是thunkMiddleware函数的代码 // 部分转为ES5代码运行middleware函数会返回一个新的函数如下 return ({ dispatch, getState }) {// next实际就是传入的dispatchreturn function (next) {return function (action) {// redux-thunk核心if (typeof action function) { return action(dispatch, getState, extraArgument);}return next(action);};}; }redux-thunk库内部源码非常的简单允许action是一个函数同时支持参数传递否则调用方法不变 redux创建Store通过combineReducers函数合并reducer函数返回一个新的函数combination这个函数负责循环遍历运行reducer函数返回全部state。将这个新函数作为参数传入createStore函数函数内部通过dispatch初始化运行传入的combinationstate生成返回store对象redux中间件applyMiddleware函数中间件的主要目的就是修改dispatch函数返回经过中间件处理的新的dispatch函数redux使用实际就是再次调用循环遍历调用reducer函数更新state 高阶组件的应用场景 权限控制 利用高阶组件的 条件渲染 特性可以对页面进行权限控制权限控制一般分为两个维度页面级别 和 页面元素级别 // HOC.js function withAdminAuth(WrappedComponent) { return class extends React.Component { state { isAdmin: false, } async componentWillMount() { const currentRole await getCurrentUserRole(); this.setState({ isAdmin: currentRole Admin, }); } render() { if (this.state.isAdmin) { return WrappedComponent {...this.props} /; } else { return (div您没有权限查看该页面请联系管理员/div); } } }; }// 使用 // pages/page-a.js class PageA extends React.Component { constructor(props) { super(props); // something here... } componentWillMount() { // fetching data } render() { // render page with data } } export default withAdminAuth(PageA); 可能你已经发现了高阶组件其实就是装饰器模式在 React 中的实现通过给函数传入一个组件函数或类后在函数内部对该组件函数或类进行功能的增强不修改传入参数的前提下最后返回这个组件函数或类即允许向一个现有的组件添加新的功能同时又不去修改该组件属于 包装模式(Wrapper Pattern) 的一种。 什么是装饰者模式在不改变对象自身的前提下在程序运行期间动态的给对象添加一些额外的属性或行为 可以提高代码的复用性和灵活性。 再对高阶组件进行一个小小的总结 高阶组件 不是组件是 一个把某个组件转换成另一个组件的 函数高阶组件的主要作用是 代码复用高阶组件是 装饰器模式在 React 中的实现 封装组件的原则 封装原则 1、单一原则负责单一的页面渲染 2、多重职责负责多重职责获取数据复用逻辑页面渲染等 3、明确接受参数必选非必选参数尽量设置以_开头避免变量重复 4、可扩展需求变动能够及时调整不影响之前代码 5、代码逻辑清晰 6、封装的组件必须具有高性能低耦合的特性 7、组件具有单一职责封装业务组件或者基础组件如果不能给这个组件起一个有意义的名字证明这个组件承担的职责可能不够单一需要继续抽组件直到它可以是一个独立的组件即可 描述事件在 React中的处理方式。 为了解决跨浏览器兼容性问题 React中的事件处理程序将传递 SyntheticEvent的实例它是跨浏览器事件的包装器。这些 SyntheticEvent与你习惯的原生事件具有相同的接口它们在所有浏览器中都兼容。 React实际上并没有将事件附加到子节点本身。而是通过事件委托模式使用单个事件监听器监听顶层的所有事件。这对于性能是有好处的。这也意味着在更新DOM时 React不需要担心跟踪事件监听器。 什么原因会促使你脱离 create-react-app 的依赖 当你想去配置 webpack 或 babel presets。 React diff 算法的原理是什么 实际上diff 算法探讨的就是虚拟 DOM 树发生变化后生成 DOM 树更新补丁的方式。它通过对比新旧两株虚拟 DOM 树的变更差异将更新补丁作用于真实 DOM以最小成本完成视图更新。 具体的流程如下 真实的 DOM 首先会映射为虚拟 DOM 当虚拟 DOM 发生变化后就会根据差距计算生成 patch这个 patch 是一个结构化的数据内容包含了增加、更新、移除等 根据 patch 去更新真实的 DOM反馈到用户的界面上。 一个简单的例子 import React from react export default class ExampleComponent extends React.Component {render() {if(this.props.isVisible) {return div classNamevisiblevisbile/div;}return div classNamehiddenhidden/div;} } 这里首先假定 ExampleComponent 可见然后再改变它的状态让它不可见 。映射为真实的 DOM 操作是这样的React 会创建一个 div 节点。 div classvisiblevisbile/div 当把 visbile 的值变为 false 时就会替换 class 属性为 hidden并重写内部的 innerText 为 hidden。这样一个生成补丁、更新差异的过程统称为 diff 算法。 diff算法可以总结为三个策略分别从树、组件及元素三个层面进行复杂度的优化 策略一忽略节点跨层级操作场景提升比对效率。基于树进行对比 这一策略需要进行树比对即对树进行分层比较。树比对的处理手法是非常“暴力”的即两棵树只对同一层次的节点进行比较如果发现节点已经不存在了则该节点及其子节点会被完全删除掉不会用于进一步的比较这就提升了比对效率。 策略二如果组件的 class 一致则默认为相似的树结构否则默认为不同的树结构。基于组件进行对比 在组件比对的过程中 如果组件是同一类型则进行树比对如果不是则直接放入补丁中。 只要父组件类型不同就会被重新渲染。这也就是为什么 shouldComponentUpdate、PureComponent 及 React.memo 可以提高性能的原因。 策略三同一层级的子节点可以通过标记 key 的方式进行列表对比。基于节点进行对比 元素比对主要发生在同层级中通过标记节点操作生成补丁。节点操作包含了插入、移动、删除等。其中节点重新排序同时涉及插入、移动、删除三个操作所以效率消耗最大此时策略三起到了至关重要的作用。通过标记 key 的方式React 可以直接移动 DOM 节点降低内耗。 传入 setstate函数的第二个参数的作用是什么 第二个参数是一个函数该函数会在 setState函数调用完成并且组件开始重渲染时调用可以用该函数来监听渲染是否完成。 this.setstate({username: 有课前端网,},() console.log(re-rendered success. ) );React组件的构造函数有什么作用它是必须的吗 构造函数主要用于两个目的 通过将对象分配给this.state来初始化本地状态将事件处理程序方法绑定到实例上 所以当在React class中需要设置state的初始值或者绑定事件时需要加上构造函数官方Demo class LikeButton extends React.Component {constructor() {super();this.state {liked: false};this.handleClick this.handleClick.bind(this);}handleClick() {this.setState({liked: !this.state.liked});}render() {const text this.state.liked ? liked : haven\t liked;return (div onClick{this.handleClick}You {text} this. Click to toggle. /div);} } ReactDOM.render(LikeButton /,document.getElementById(example) ); 构造函数用来新建父类的this对象子类必须在constructor方法中调用super方法否则新建实例时会报错因为子类没有自己的this对象而是继承父类的this对象然后对其进行加工。如果不调用super方法子类就得不到this对象。 注意 constructor () 必须配上 super(), 如果要在constructor 内部使用 this.props 就要 传入props , 否则不用JavaScript中的 bind 每次都会返回一个新的函数, 为了性能等考虑, 尽量在constructor中绑定事件 React 中 refs 干嘛用的 Refs 提供了一种访问在render方法中创建的 DOM 节点或者 React 元素的方法。在典型的数据流中props 是父子组件交互的唯一方式想要修改子组件需要使用新的pros重新渲染它。凡事有例外某些情况下咱们需要在典型数据流外强制修改子代这个时候可以使用 Refs。 咱们可以在组件添加一个 ref 属性来使用该属性的值是一个回调函数接收作为其第一个参数的底层 DOM 元素或组件的挂载实例。 class UnControlledForm extends Component {handleSubmit () {console.log(Input Value: , this.input.value);};render() {return (form onSubmit{this.handleSubmit}input typetext ref{(input) (this.input input)} /button typesubmitSubmit/button/form);} }请注意input 元素有一个ref属性它的值是一个函数。该函数接收输入的实际 DOM 元素然后将其放在实例上这样就可以在 handleSubmit 函数内部访问它。 经常被误解的只有在类组件中才能使用 refs但是refs也可以通过利用 JS 中的闭包与函数组件一起使用。 function CustomForm({ handleSubmit }) {let inputElement;return (form onSubmit{() handleSubmit(inputElement.value)}input typetext ref{(input) (inputElement input)} /button typesubmitSubmit/button/form); }react-router4的核心 路由变成了组件分散到各个页面不需要配置 比如link route/route
http://www.hkea.cn/news/14323110/

相关文章:

  • 做网站插背景图片如何变大wordpress登入页面
  • 网站注册需要什么网站框架怎么做
  • 邢台网站设计厂家发帖网站百度收率高的
  • 北京公司建网站要多少费用信阳网站推广公司
  • 深圳网站建设推广建设一个网站app需要多少钱
  • 南安市网站建设怎么自己做网站空间
  • 毕业设计做网站怎么样微信小程序商城制作
  • 白酒招商网站大全百度搜索风云排行榜
  • 在模板网站建站好吗电子商务的网站建设过程
  • 网站域名的所有权怎么用域名做邮箱网站
  • 重庆最新网站备案如何给网站配置域名
  • 哈尔滨自助建站软件鲁谷网站建设
  • 湖南长沙网站建地方美食网站开发意义
  • 网站搭建费用明细吃什么补肾最快最好
  • 网站管理员可控的关键节点后台网站建设招聘
  • 网站系统建设费用营销网络电话软件
  • 用二级域名做的网站算新站吗免费动漫软件app下载大全
  • html5登录界面完整代码游戏seo推广
  • asp网站想学做宝宝食谱上什么网站
  • 菏泽市城乡和建设局网站怎么去管理好一个团队
  • 网站跳出的广告是怎么做的凡客诚品购物流程设计
  • 做网站文字要求坪山网站建设方案
  • 湘潭做网站 i磐石网络微信群推广软件
  • 海尔商务网站建设wordpress用户10亿
  • 网站建设的建议例子wordpress 多站点错误
  • 网站排名张家港seo技术培训泰州
  • dw做网站首页长宽设置多少网站建设交流qq
  • 网站手机客户端开发河北网站建设与推广
  • 网站备案完成后该如何做江宁网站建设哪家好
  • 工信部网站域名备案查询织梦cms做企业网站