响应式开发的原理(响应式开发的原理有哪些)
大家好!今天让创意岭的小编来大家介绍下关于响应式开发的原理的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
创意岭作为行业内优秀企业,服务客户遍布全国,相关业务请拨打175-8598-2043,或微信:1454722008
本文目录:
一、vue第八节
Vuex是vue官方的一款状态管理工具,什么是状态呢?我们在前端开发中有一个概念:数据驱动,页面中任意的显示不同,都应该有一条数据来控制,而这条数据又叫做state,状态。
在vue中。组件间进行数据传递、通信很频繁,而父子组件和非父子组件的通信功能也比较完善,但是,唯一困难的就是多组件间的数据共享,这个问题由vuex来处理
vue提供的一个全局的状态管理工具,主要处理项目中多组件间状态共享
因为在组件中可以通过this. store.state来使用state中管理的数据
但是我们发现,这样使用的话,当state的数据更改的时候,vue组件并不会重新渲染
也就是说,如果想要在组件中响应式的使用的时候,我们需要通过计算属性(computed)来使用
这样的写法很无趣,而且如果使用的状态较多会产生冗余的感觉,所以vuex提供了mapState辅助函数,帮助我们在组件中获取并使用vuex的store中保存的状态
所以我们可以这样写:
但是如果组件中已经有了num这个数据了,而state中的数据名字也叫num就会照成冲突,这个时候我们可以在组件使用state的时候,给状态起个别名:
但是,有的时候我们在组件中还有自己的业务逻辑需要用到计算属性:
有的时候,我们需要根据state中的某一个状态派生出一个新的状态,例如,我们state中有一个num,在某些组件中需要用到是num的二倍的一个状态,我们就可以通过getters来创建
创建了之后,在组件中通过this.$store.getters.doubleNum来获取里面的数据
当然vuex也提供了mapGetters辅助函数来帮助我们在组件中使用getters里的状态,且,使用的方法和mapState一模一样
我们不能直接在组件中更改state:this.$store.state.num=2,而是需要使用mutations来更改,mutations也是一个纯对象,里面包含很多更改state 的方法,这些方法的形参接收到state,在函数体里更改,这时,组件用到的数据也会更改,实现响应式。
但是我们也不能直接调用mutations 的方法,需要使用this.$store.commit来调用,第一个参数为调用的方法名,第二げ参数为传递参数
vuex提供了mapMutations方法来帮助我们在组件中调用mutations 的方法,使用方法和mapState、mapGetters一样
Action 类似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。
也就是说,如果有这样的需求:在一个异步处理之后,更改状态,我们在组件中应该先调用actions,来进行异步动作,然后由actions调用mutation来更改数据
如上,actions的方法中可以进行异步的动作,且形参会接收store,从中取出commit方法用以调用mutations的方法
在组件中通过this.$store.dispatch方法调用actions的方法
当然也可以使用mapMutations来辅助使用
组件使用数据且通过异步动作更改数据的一系列事情:
1.生成store,设置state
2.在根实例中注入store
3.组件通过计算属性或者mapState来使用状态
4.用户产生操作,调用actions的方法,然后进行异步动作
5.异步动作之后,通过commit调用mutations的方法
6.mutations方法被调用后,更改state
7.state中的数据更新之后,计算属性重新执行来更改在页面中使用的状态
8.组件状态被更改...创建新的虚拟dom......
9.组件的模板更新之后重新渲染在dom中
vuex的使用:
目前市场上有两种使用vuex的情况,
第一种:将需要共享、需要管理的状态放入vuex中管理,也就是说在必要时使用
第二种:将所有的数据都交由vuex管理,由vuex来承担更多的责任,组件变得更轻量级,视图层更轻
在实现回到顶部功能的时候,我们写了一个backTop组件,接下来需要通过监听window.scroll事件来控制这个组件显示隐藏
写了一个v-back-top指令,就是将回到顶部功能做成一个指令,哪个组件或者dom需要使用到回到顶部,就加上这个指令就可以,设置不同的参数来控制在不同的情况下触发
组件库就是通用组件的集合
pc:element-ui iview
mobile: mint-ui
当我们在使用一些插件的时候,经常需要在dom更新完成后进行必要操作,但是在vue中提供的api只有updated钩子函数,而在这个函数里,任意数据的变化导致的dom更新完成都会触发,所以很可能会造成无关数据的影响,而使用监听的话只能监听到数据的变化,此时dom还没有更新,我们只能强行使用setTimeout来处理
这里推荐大家使用nextTick全局方法:
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
v-for='n in 10' n会打印1-10
通用:beforeCreate/created/beforeMount/mounted/beforeUpdate/updated/beforeDestroy/destroyed
路由守卫:beforeRouteEnter/beforeRouteUpdate (2.2 新增)/beforeRouteLeave
v-if是真正的条件渲染,会确保在切换中条件块内的事件监听、子组件都会适当的被销毁和重建
v-show总是将节点渲染在dom中,只是基于css:display来控制节点的显示和隐藏
v-if有更高的切换开始,v-show有更高的初始渲染开销
v-if是惰性的,初始条件为假,就不会渲染
axios请求的时候不会带上cookie,不会影响带宽,可以通过withCredentials:true来设置
对axios 的请求头进行设置:
axios.defaults.headers = {'Content-Type':'...'}
vue2.0不在更新维护vue-resource,官方推荐使用axios
6.为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板。这个过程被称为内容分发 (即 Angular 用户熟知的“transclusion”)。Vue.js 实现了一个内容分发 API,参照了当前 Web Components 规范草案,使用特殊的 <slot> 元素作为原始内容的插槽。
全局:Vue.component(name,Vue.extend({}))
局部:{ components:{name:Vue.extend({})} }
假设我们有一个数据为num,还希望拥有一个数据为doublenum,而且希望doublenum的值永远都是num的二倍
方法:
prop是单向绑定的,父组件属性变化,传递给子组件,但是,子组件数据变化,不能直接传递给父组件,也就是数据的流行是从父组件流向子组件的,为了防止子组件修改父组件的数据(会让应用的数据流变的更难开发、更新、维护)
使用了vuex工具的时候,store中数据在组件中使用的过程也是单向数据流,state->vue component->actions->mutations->state->vue component
当数据改变之后,vue会创建新的虚拟dom来和原来的虚拟dom做对比,在创建新的虚拟的dom的时候,会根据key来查找在原来的虚拟dom中有没有某个部分,如果原来的有,这次的也需要,就会实现复用,而且在做diff对比的时候,如果有key会加快对比的查找速度,提高性能
尽量循环的时候不要将key设置为数组的索引,因为当删除某一个元素的时候,就会导致删除位置下面的所有元素的key值都与上一次虚拟dom的key值不同,导致复用失败,这个时候我们最好使用关键的唯一的,例如id这样的数据作为key
如果数据变化只是值的变化而不是条数和位置的变化,可以使用索引作为key
Vue.use会查找插件对象里的install方法去执行,并且给install方法里传入Vue对象
很多情况下,一个应用会有PC和移动端两个版本,而这两个版本因为差别大,内容多,所以不能用响应式开发但是单独开发,而域名只有一个,用户进入域后直接返回对应设备的应用,做法主要有两种:
二、Android真的推荐用MVI模式?MVI和MVVM有什么区别?
android自己卷自己,自己造一个MVI架构模式吗?
MVI架构模式是国内android开发者最近一两年造出来的吗?
看了很多MVI的资料,发现都提到cycle.js框架。android的mvi架构就是启发于cycle.js框架。
我们再看看Cycle.js框架是什么时候开始的,又是什么时候开始使用MVI模式的。
Cycle.js框架 第一个预发版本 :
https://github.com/cyclejs/cyclejs/releases?page=6
再结合官方文档来看,Cycle.js框架就是为了MVI架构模式而生的。
虽然不知道,Cycle.js框架是不是首个MVI模式框架。
但是从很多资料可以推测,MVI架构模式就是Cycle.js框架推广开来的。
而且早在2014年就已经在前端开发中用得飞起了。
想想2014年,咱们在干嘛?android在用什么架构模式。
正所谓,天下武功出少林啊。
我们android的很多技术,在前端早就用“烂了”。
我们知道MVP和MVVM的爹都是MVC。MVI的爹也是MVC。
MVC的Controller是命令是编程组件,不能直接实现响应式编程思想。
响应式编程范式(Reactive programming):
安卓官方的compose框架、微信小程序、Flutter、React、鸿蒙UI的开发框架,都是使用响应式开发框架。
这里就不拓展开来讲了,上面提到的任何一个开发框架,你只要会一个基本就能理解响应式编程范式。
如果一个都不会也没关系,现在不理解响应式编程也没关系,等你学会MVI就理解了,这种只有实际使用过才能深刻理解。
学不会也没关系,不要焦虑(尤其那些工作不久的小伙伴,学不会属于正常现象~)
MVI,咱第一遍学不会,就等2年,再学一遍~
2年后也没学会,那就再等2年~ 一定要有耐心~
如果还是学不会,那也没关系,因为MVI早晚也会过时~ 等过时了就不用学了~
哈哈哈~ 别笑,正经Android可不会开玩笑的。
就像rxjava,当年有多少人死活学不会,android开发现在谁还学Rxjava?哈哈哈~
用一张图来总结这次升级的核心思想:
新版架构指南在旧版的基础上,做了如下调整和建议:
1. 将LiveData组件改成了StateFlow
对协程的使用更友好。并且更能体现面向数据流开发的思想。
实际上,依然使用LiveData也没毛病。
2. ViewModel传递给View的数据限制为View的UIState
ViewModel从Model层获取数据后,转换为UIState数据,通过StateFlow流向View层。
UIState的数据面向界面组件而定义的,是能直接控制View组件如何显示的数据。
所以我们也可以称UIState为界面的状态或者View的状态。
如下:
3. 单数据流还是多数据流的选择
官方指南并没有强制我们使用单流。
同一个界面应该使用单个StateFlow还是多个StateFlow,需要我们自己判断。
我们应该根据UIStates数据们之间关联程度来决定多流还是单流。
单流优缺点都十分明显:
优点: 数据集中管控,会提高代码的可读性和修改的便利性。
缺点: 当数据非常多且复杂时,会影响效率。因为我们没有diff功能,View层不能只更新有变化的数据,只会根据UIState刷新当前界面。
https://developer.android.com/jetpack/guide/ui-layer#additional-considerations
我们再看下官方新版架构图:
当然不仅仅MVVM可以改造成响应式开发范式,MVP也是可以的。
不信你看 这篇blog :
https://www.raywenderlich.com/817602-mvi-architecture-for-android-tutorial-getting-started
1. 理解MVC架构模式的思想【MVC是其他架构模式之爹,他的思想是MVP、MVVM、MVI的基础,学会它是关键步骤~】。
3. 学习kotlin的StateFlow组件,的使用:Sequence->Flow->StateFlow。
4. 学习ViewModel组件的使用(虽然不用ViewModel也能实现MVI架构,但是ViewModel还是值得学习)。
5. 理解DRY(Don't Repeat Yourself)原则。
6. 理解MVVM(因为官方的MVI模式是基于MVVM的基础改造的~)。
7. 学习官方架构指南。
8. 实战。
在这里就分享一份由大佬亲自收录整理的 学习PDF+架构视频+面试文档+源码笔记 , 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料
这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。
当然,你也可以拿去查漏补缺,提升自身的竞争力。
真心希望可以帮助到大家,Android路漫漫,共勉!
如果你有需要的话,只需 私信我【进阶】即可获取
三、响应式开发技术应用机房考还是出试卷
响应式开发技术应用机房考。根据查询相关资料信息,响应式布局是在屏幕尺寸发生变化时,APP的页面、组件按照规则进行动态自适应,实现一套代码兼容多尺寸终端设备,在机房考。
四、如何快速开发html5响应式网页
步骤1 创建空白的HTML 5模版
首先,我们创建一个空白的模版,代码很简单,如下所示:
复制代码
步骤2 增加HTML 5新标签 HTML 5中新增加了不少标签,如:
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section
在页面模版中,我们需要确保每个区域都能正确地对齐,因此需要使用HEADER、 NAVIGATION、 CONTENT、 SIDEBAR和Footer这些标签。代码如下所示:
复制代码
读者可能留意到这里使用的div id=”wrapper”,这个是稍候用来做meida query的时候调整全局CSS样式调整用的 步骤3 往HTML 5标签中增加代码
1)首先往标题中增加如下代码:
Simple HTML5 Template
复制代码
2)往导航标签中添加如下代码,这样很方便地构件了一个简单的页面分类导航:
Home About Parent Page Child
One Child Two with child Child One Child
Two Child Three Child Three
Contact
复制代码
3)使用标签来描述每一个要展示的内容实体,比如要展示的是多篇文章列表,其中的每一篇文章的具体内容就可以使用标签了。如下代码所示:
This is a title for post
Richard KS 20th March 2013 Tutorials HTML5, CSS3
and Responsive 10 Comments Lorem
Ipsum is simply dummy text of the printing and typesetting industry.
Lorem Ipsum has been the industry's standard dummy text ever since the
1500s
复制代码
4)添加标签 HTML5提供的元素标签用来表示当前页面或文章的附属信息部分,可以包含与当前页面或主要内容相关的引用、侧边栏、广告、nav元素组,以及其他类似的有别与主要内容的部分。
根据目前的规范,元素有两种使用方法:
被包含在中作为主要内容的附属信息部分,其中的内容可以是与当前文章有关的引用、词汇列表等。
在之外使用,作为页面或站点全局的附属信息部分;最典型的形式是侧边栏(sidebar),其中的内容可以是友情链接、附属导航或广告单元等。
代码如下:
Categories Category 1 Category 2
Parent Category Child One Child Two
Grandchild One Grandchild Two Grandchild Three
Child Three Category 3
Text Lorem Ipsum is simply dummy
text of the printing and typesetting industry.
复制代码
5)加上最后的标签,代码为:
Copyright@ 2013 HTML5.com Privacy Policy - About Us
复制代码
步骤4 增加CSS样式
首先创建一个空白的样式,如下:
[/code] 然后在http://necolas.github.com/normalize.css/中下载这个css,然后将其内容复制到该空白的文件中代码如下: [code]body {
font-family: arial, sans-serif;
font-size: 100%; /* best for all browser using em */
padding:0;
margin:0;
}
*, html { line-height: 1.6em; }
article img { width:auto; max-width:100%; height:auto; }
.sidebar a, article a, header a, footer a { color: #C30; }
header a { text-decoration: none; }
#wrapper {
font-size: 0.8em; /* 13px from 100% global font-size */
max-width: 960px; /* standard 1024px wide */
margin: 0 auto;
}
/* css for */
header { padding: 1em 0; margin: 0px; float: left; width: 100%;
}
header hgroup { width: 100%; font-weight:normal; }
/* css for */
nav
{ display: block; margin: 0 0 2em; padding: 0px;
float: left; width: 100%; background-color: #181919;
}
nav ul ul {display: none;}
nav ul li:hover > ul {display: block;}
nav
ul { padding: 0; list-style: none; position:
relative; display: inline-table; z-index: 9999;
margin: 0px; float: left; width: 100%;
}
nav ul:after {content: ""; clear: both; display: block;}
nav ul li {float: left;}
nav ul li:hover a {color: #fff;}
nav
ul li a { display: block; padding: 1em; font-size:
1.125em; color: #ccc; text-decoration: none;
margin: 0px; background-color: #000; border-right: 1px
solid #333;
}
nav ul li:last-of-type a {border-right: 1px solid transparent !important;}
nav
ul ul { background: #5f6975; border-radius: 0px;
padding: 0; position: absolute; top: 100%; width:
auto; float: none;
}
nav ul li:hover { background: #5f6975; color: #FFF;
}
nav ul ul li a:hover { background-color: #4b545f;
}
nav ul ul li {
float: none;
border-bottom: 1px solid #444240;
position: relative;
}
nav ul ul li a {
padding: 0.5em 1em;
font-size: 1em;
width:10em;
color: #fff;
}
nav ul ul ul {
position: absolute; left: 100%; top:0;
}
/* css for */
section.content { width: 70%; float:left; }
.content article { width:100%; float:left; padding: 0 0 1em; margin: 0 0 1em; border-bottom: 1px solid #ddd; }
article .entry { clear:both; padding: 0 0 1em; }
h1.post-title { font-size: 1.8em; margin:0; padding:0;}
.entry.post-meta { color: #888; }
.entry.post-meta span { padding: 0 1em 0 0; }
.entry.post-content { font-size: 1.125em; margin:0; padding:0;}
/* css for */
aside.sidebar { width: 25%; float:right; }
aside.sidebar ul { width:100%; margin: 0px; padding: 0px; float: left; list-style: none;
}
aside.sidebar
ul li { width:100%; margin: 0px 0px 2em; padding:
0px; float: left; list-style: none;
}
aside.sidebar ul li ul li { margin: 0px 0px 0.2em; padding: 0px;
}
aside.sidebar
ul li ul li ul li { margin: 0px; padding: 0px 0px 0px
1em; width: 90%; font-size: 0.9em;
}
aside.sidebar
ul li h4.widget-title { width:100%; margin: 0px;
padding: 0px; float: left; font-size: 1.45em;
}
/* css for */
footer { width: 98%; float:left; padding: 1%; background-color: white; margin-top: 2em;
}
footer .footer-left { width: 45%; float:left; text-align:left; }
footer .footer-right { width: 45%; float:right; text-align:right; }
复制代码
步骤5 为移动应用使用@media query查询 为了进行响应式设计,最佳的方案是使用@media query去进行查询,在上面的CSS代码中添加如下代码:
/* ipad 768px */
@media only screen and (min-width:470px) and (max-width:770px){
body { background-color: red; } #wrapper { width:96%; font-size: 0.6875em; }
section.content, aside.sidebar { width:100%; }
}
/* iphone 468px */
@media only screen and (min-width:270px) and (max-width:470px){
body { background-color: yellow; } #wrapper { width:96%; font-size: 0.6875em; }
section.content, aside.sidebar { width:100%; }
}
复制代码
步骤6 增加jquery,modernizer和html5shiv到标签中 这里推荐使用Modernizr 和html5shiv,它们都是一个能在多种浏览器中通过运行各种脚本兼容运行支持大部分HTML 5标签的插件。我们将它们和jQuery库放在标签前,代码如下:
0
复制代码
以上就是关于响应式开发的原理相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读:
响应式网页设计和自适应网页区别(响应式网页设计和自适应网页区别是什么)