首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

干货 | 携程火车票Flutter最佳实践

FPS是一个动态过程,页面滑动这个是一直变化的,最右边的是当前帧。出现红色则表示耗时超过16.6ms,也就是发生丢帧现象,也是我们常说的页面闪动问题。...针对这种情况我们对将要加载的图片进行预加载处理,比如列表页在分页请求数据回来的时候做图片预加载。还有,下一个页面的图片,需要一进去就有图片直接显示,就可以在当前页面做图片预加载。 ?...4.2 Flutter 数据预加载 为了缩短用户的加载等待时长,我们经常需要一些预加载方法。比如在前一个页面加载下一个页面的数据,或者在长列表的分页请求时候,可以做分页预加载。...比如当你滑动到第五个可见的时候,就提前把下一页的数据加载好。 列表页通过桥方法获取上一个页面加载的数据,这样就能有一个直出体验,这里要考虑数据已经加载好、加载中、加载失败的情况。...错误分析 出现这个问题的原因在于使用Text.rich来展示多个Span组件,如果设置了最大行数,当组件超过最大行数,有别的组件未成功展示,再次点击当前widget,使它接受时间,就会导致crash

2.1K30

如何优化你的超大型React应用

一旦使用这类型技术架构,状态数据集中管理,单向数据流,不可变数据,路由懒加载,按需加载组件,适当的缓存机制(PWA技术),细致拆分组件,单一数据来源刷新组件,这些都是我们可以精细化的方向。...second.value]); console.log('Message posted to worker'); } 这段代码中变量first和second代表2个元素;它们当中任意一个的发生改变...使用requestAnimationFrame,当页面处于未激活的状态下,该页面的屏幕刷新任务会被系统暂停,由于requestAnimationFrame保持和屏幕刷新同步执行,所以也会被暂停。...当页面被激活,动画从上次停留的地方继续执行,节约 CPU 开销。...一个刷新间隔内函数执行多次没有意义的,因为显示器每 16.7ms 刷新一次,多次绘制并不会在屏幕上体现出来 在高频事件(resize,scroll等)中,使用requestAnimationFrame

2.1K50
您找到你想要的搜索结果了吗?
是的
没有找到

React 开发要知道的 34 个技巧

}; 复制代码 2.16.x 之后的Context使用了Provider和Customer模式,在顶层的Provider中传入value,在子孙级的Consumer中获取该,并且能够传递函数,用来修改...context 声明一个全局的 context 定义,context.js import React from 'react' let { Consumer, Provider } = React.createContext...刷新才会加载出来 5.优缺点 1.params在HashRouter和BrowserRouter路由中刷新页面参数都不会丢失 2.state在BrowserRouter中刷新页面参数不会丢失,在HashRouter...路由中刷新页面会丢失 3.query:在HashRouter和BrowserRouter路由中刷新页面参数都会丢失 4.query和 state 可以传对象 复制代码 1.6 onRef 原理:onRef...2.核心 API: loader:需要加载的组件 loading:未加载出来的页面展示组件 delay:延迟加载时间 timeout:超时时间 3.使用方法: 安装 react-loadable ,babel

1.4K31

React 入门学习(十七)-- React 扩展

LazyLoad 懒加载React 中用的最多的就是路由组件了,页面刷新,所有的页面都会重新加载,这并不是我们想要的,我们想要实现点击哪个路由链接再加载即可,这样避免了不必要的加载 我们可以发现...,我们页面加载,所有的路由组件都会被加载 如果我们有 100 个路由组件,但是用户只点击了几个,这就会有很大的消耗,因此我们需要做懒加载处理,我们点击哪个,才去加载哪一个 首先我们需要从 react...,所有的路由我们要点击再加载 初次登录页面的时候 注意噢,这些文件都不是路由组件,当我们点击了对应组件之后才会加载 从上图我们可以看出,每次点击,才会去请求 chunk 文件 那我们更改写的...它会在页面还没有加载出来的时候显示 注意:因为 loading 是作为一个兜底的存在,因此 loading 是 必须提前引入的,不能懒加载 3....(() => { console.log('被调用了');}, []) 这样我们只有在组件第一次挂载的时候触发 当然当页面中有多个数据源,我们也可以选择个别的数据进行监测以达到我们想要的效果 React.useEffect

81030

React 入门学习(十七)-- React 扩展

LazyLoad 懒加载React 中用的最多的就是路由组件了,页面刷新,所有的页面都会重新加载,这并不是我们想要的,我们想要实现点击哪个路由链接再加载即可,这样避免了不必要的加载 我们可以发现...,我们页面加载,所有的路由组件都会被加载 如果我们有 100 个路由组件,但是用户只点击了几个,这就会有很大的消耗,因此我们需要做懒加载处理,我们点击哪个,才去加载哪一个 首先我们需要从 react...,所有的路由我们要点击再加载 初次登录页面的时候 注意噢,这些文件都不是路由组件,当我们点击了对应组件之后才会加载 从上图我们可以看出,每次点击,才会去请求 chunk 文件 那我们更改写的...它会在页面还没有加载出来的时候显示 注意:因为 loading 是作为一个兜底的存在,因此 loading 是 必须提前引入的,不能懒加载 3....(() => { console.log('被调用了');}, []) 这样我们只有在组件第一次挂载的时候触发 当然当页面中有多个数据源,我们也可以选择个别的数据进行监测以达到我们想要的效果 React.useEffect

68530

ReactRouter的实现

API以及popstate事件等来处理URL,其能够创建一个像https://www.example.com/path这样真实的URL,同样在页面跳转无须重新加载页面,当然也不会对于服务端进行请求,当然对于...history模式仍然是需要后端的配置支持,用以支持非首页的请求以及刷新后端返回的资源,由于应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问URL就会返回404,所以需要在服务端增加一个覆盖所有情况的候选资源...,如果URL匹配不到任何静态资源,则应该返回同一个index.html应用依赖页面,例如在Nginx下的配置。...,这也是SPA单页应用的特点,其所有的活动局限于一个Web页面中,非懒加载页面仅在该Web页面初始化时加载相应的HTML、JavaScript、CSS文件,一旦页面加载完成,SPA不会进行页面的重新加载或跳转...,Router中的history监听着整个页面的路由变化,当页面发生跳转,history触发监听事件,Router向下传递nextContext,就会更新Route的props和context来判断当前

1.3K10

Hooks + TS 搭建一个任务管理系统(一)-- 登录注册页面

,将逻辑分开来,我们通过 props 向这两个组件传递了 onError 方法,在组件中可以通过调用这个方法来设置 error 状态的,再展示到页面上 在这里值得我们注意的是,和类式组件不同,函数式组件会默认的接收...fetch 能够发送登录的请求,当成功返回结果,就会调用前面的函数来设置一个本地的 token ,用来保存用户的登录状态 这里有个比较重要的点:由于我们的请求都是异步的因此我们在 then 中需要采用..., logout, register }} /> 这里的 value 设置的就是它的 context 容器中的 通过编写这个 custom hook 我们对 useAsync 有了更好的理解,同时也学会了如何使用...会触发 catch 中的 onError 设置 index 中的 error 状态,显示在页面当中 总结 在这个登录注册页面当中,我们可以学到以下几点 context 状态管理 custom hook...在 react 中的强大威力 当 custom hook 返回函数,需要使用 useCallback 包裹 多利用解构赋值,来优化代码 useState 设置的变量,类型会跟随初始的类型 对于不同的事务

1.3K11

React 开发必须知道的 34 个技巧【近1W字】

}; 2.16.x 之后的Context使用了Provider和Customer模式,在顶层的Provider中传入value,在子孙级的Consumer中获取该,并且能够传递函数,用来修改context...声明一个全局的 context 定义,context.js import React from 'react' let { Consumer, Provider } = React.createContext...可以传对象,但是刷新页面参数会丢失 1.6 onRef 原理:onRef 通讯原理就是通过 props 的事件机制将组件的 this(组件实例)当做参数传到父组件,父组件就可以操作子组件的 state...2.核心 API: loader:需要加载的组件 loading:未加载出来的页面展示组件 delay:延迟加载时间 timeout:超时时间 3.使用方法: 安装 react-loadable...14.动态组件 场景:做一个 tab 切换就会涉及到组件动态加载 实质上是利用三元表达式判断组件是否显示 class FourteenChildOne extends React.Component

3.4K00

React中实现和Vue一样舒适的keep-alive

假设有下述场景: 移动端中,用户访问了一个列表页,上拉浏览列表页的过程中,随着滚动高度逐渐增加,数据也将采用触底分页加载的形式逐步增加,列表页浏览到某个位置,用户看到了感兴趣的项目,点击查看其详情,进入详情页...,因为某些原因需要临时离开交互场景,则需要对状态进行保存 在 React 中,我们通常会使用路由去管理不同的页面,而在切换页面,路由将会卸载掉未匹配的页面组件,所以上述列表页例子中,当用户从详情页退回列表页...: {this.props.children} 是这个组件的所有子元素,必须要渲染 使用ReactContext API进行传递KEEP方法给所有的子孙组件,每次这个方法被调用,都会造成AliveScope...'react' const { Provider, Consumer } = createContext() const withScope = WrappedCompoennt...的真正区别,withScope使用了context api捕获了传入的虚拟DOM节点,桥接了父组件以及KeepAlive组件的关联,一旦children属性改变,那么withScope被刷新,进而传入新的

2.2K10

2021 年值得期待的 Flutter 数据流管理方案

对于声明式的 UI 而言,UI = f(state),f 是 build 方法,方案的设计首先应该考虑的是能够使得状态的消费者可以获取到对应的数据,在状态更新被通知到,并可以减少不必要的刷新。...,刚开始的时候不太熟悉 provider,真的会写出一堆性能不是很好的代码,主要有以下这两个问题: 尽管 provider 已经帮我们做了很多优化,包括懒加载等,但如果没有用好 Selector 增强或者...Consumer,再有 ViewModel 层有不必要的重建之类,还是会导致页面不必要的刷新 不同页面数据有依赖关系或者包含关系,不好做数据依赖刷新。...3.4 封装通用的页面容器 在 业务场景中,绝大多数页面都是需要通过 api 请求获取数据,根据返回结果页面显示:加载中、正常页面、空状态、网络错误、其他错误这么几种情况。...封装中用到的几个类如下: ChangeNotifier:是 Flutter 实现的一个监听-订阅类 NormalPageState:页面状态枚举 NormalPageController:负责页面状态变化

1.9K20

基于 LeanCloud 的无后端评论库 Nexment,于任何 Web 应用或前端项目使用

最后的妥协是通过 iFrame 引用然后通过强制同源在父页面获取子页面窗口高度来实现评论区高度匹配。...同时,这样的部署有几个影响用户体验的问题: 高度获取需要暴力的循环获取直到评论区页面加载完毕 新评论发布无法处理回调,评论区高度无法更新 移动端样式不统一 有了这些痛点,同时借机最近发现的 LeanCloud...最初使用 Rollup.js 打包器配置好了环境 (参见早前的 Commits),但是在本地测试出现了 React Hooks 由于「存在多个 React 副本」的问题,查阅文档和论坛都无果还花费了半天时间经历了简直和第一次折腾...功能实现 异步数据获取与更新 首先在 React.js 使用了 SWR,其可借助 React Hooks 实现异步数据获取、聚焦刷新、数据缓存的功能,不通过 WebSocket 来变相实现数据同步。...provider export const Provider = Context.Provider; export default Context; /* use context */ import

80920

react-router 的使用与优化

history 还有三个方法,调用这三个方法相当于点击了前进或者后退按钮,但页面刷新: back() 表示向后跳转一个页面; forward() 表示向前跳转一个页面; go(number) 当是负值表示向后移动一个页面...,当是正数表示向后移动一个页面; 使用 HTML5 中的路由,需要后端的配合。...当点击 Link 包裹的文字后,就会使用该路径,并将路径匹配到的组件加载页面上。...有些组件可能一开始加载页面并不会需要或者说不去渲染,而是点击某个按钮才做展示。这些组件我们可以不放在打包好的代码中,而是触发事件才去发起网络请求再渲染。...fallback 同样表示加载加载组件,而且必须指定 fallback 属性。

3.2K10

精读《怎么用 React Hooks 造轮子》

下面举几个例子: 修改页面 title 效果:在组件里调用 useDocumentTitle 函数即可设置页面标题,且切换页面页面标题重置为默认标题 “前端精读”。...,网络是否断开 效果:在组件调用 useWindowSize ,可以拿到页面大小,并且在浏览器缩放自动触发组件更新。...利用 requestAnimationFrame 在给定时间内给出 0-1 之间的,那每次刷新,只要判断当前刷新的时间点占总时间的比例是多少,然后做分母,分子是 1 即可。...实际调用方式一般是,先通过 useState 拿到一个,再通过动画函数包住这个,这样组件就会从原本的刷新一次,变成刷新 N 次,拿到的也随着动画函数的规则变化,最后这个会稳定到最终的输入(如例子中的...对,Hooks 并不解决 Provider 的问题,所以全局状态必须有 Provider,但这个 Provider 可以利用 React 内置的 createContext 简单搞定: const StoreContext

2.4K40

React 新特性讲解及实例(一)

Provider 的 value 发生变化时,它内部的所有消费组件都会重新渲染。...如果有多个 Context 的话,只要把对应的 Provier 嵌套进来即可,顺序并不重要。同样也加个 button 来切换 online 的。...这能让你使用 this.context 来消费最近 Context 上的那个。你可以在任何生命周期中访问到它,包括 render 函数中。 你只通过该 API 订阅单一 context。...因为 App 渲染完成后,包含 About 的模块还没有被加载完成,React 不知道当前的 About 该显示什么。我们可以使用加载指示器为此组件做优雅降级。...重新加载页面后,会发现整个页面都报错了: ? 在实际业务开发中,我们肯定不能忽略这种场景,怎么办呢? 错误边界(Error boundaries) 如果模块加载失败(如网络问题),它会触发一个错误。

74230

React高级特性解析

react conText 使用API React.createContext  返回的是组件对象 可以利用结构的方式 第一种方式 使用Provider包裹的组件都可以获取提供者的value Context.Consumer...组件里面使用函数 函数返回一个组件 函数的参数为Context初始化的参数 第二种方式 使用Context.Provider包裹所有的组件 在子组件里面使用static contextType = 创建的... 返回一个组件 函数里面将公共的逻辑抽离出来 例如:每个页面都需要加载数据 渲染页面 那么就可以将公共的获取数据接口抽离出来 对指定组件进行渲染 hoc生命周期  组件的didMount -> hocDidMount...换成真正的组件 HOOK 钩子 HOOK提供了一系列函数式组件的钩子 const [value, setValue] = useState(); value则是state状态  setValue 则是个函数 需要设置直接调用...setValue 传入需要设置即可 useEffect     传入一个匿名函数   该匿名函数的作用相当于DidMount和DidUpdate  可以在匿名函数里面返回一个函数 Component

89920
领券