- 博客(157)
- 资源 (43)
- 收藏
- 关注

原创 Netty框架的简单使用,实现socket通讯
个人博客:haichenyi.com。感谢关注 题外话,很多人都把JDK1.4提供的NIO称之为异步非阻塞I/O;其实,并不然,从严格意义上面讲,它只能称为非阻塞I/O。在JDK1.7提供的NIO 2.0,新增了异步的套接字通道Channel,它才是真正的异步非阻塞I/O。下表是不同I/O模型的对比:表1-1 几种I/O模型和同能对比 同步阻塞I/O(BIO) 伪异步I/...
2018-02-12 11:15:43
17745
1
原创 【Vue】 深入解析组件通信:从父子组件到跨层级通信
优先使用 props + 自定义事件。简单场景用 Event Bus,复杂场景用 Vuex/Pinia。provide/inject 或全局状态管理。parent/children 和直接修改 Props。理解每种方式的原理和适用边界,才能写出高可维护性的 Vue 代码。
2025-04-22 18:25:23
951
原创 【Vue】 keep-alive:让组件状态“永生”的魔法
场景推荐使用注意事项表单页跳转后返回需保留数据✅结合路由 meta 标记长列表滚动位置恢复✅配置路由的滚动行为高频切换的 Tab 页✅设置 max 防内存溢出静态内容展示❌无状态变化,无需缓存通过合理使用 keep-alive,你可以轻松实现组件状态的持久化,提升用户体验和性能。但切记:缓存是把双刃剑,过度使用会导致内存膨胀,需结合业务场景谨慎设计。
2025-04-21 18:29:05
1013
原创 【Vue】修饰符
分类修饰符示例作用事件控制事件传播和默认行为表单优化输入更新和格式过滤键盘监听特定按键或组合键鼠标.right限制鼠标按键触发v-bind控制属性绑定方式。
2025-04-21 17:59:17
585
原创 【Vue】父子组件的生命周期
父子组件生命周期的核心规律是父组件进入阶段后等待子组件完成,再继续自身流程。掌握这一顺序,可以精准控制数据流和DOM操作时机,避免因生命周期混乱导致的Bug。
2025-04-17 19:03:20
906
原创 观察者模式与发布订阅模式:解耦与通信的艺术
观察者模式 是 “我直接通知你”,强调直接、高效的同步通信。发布订阅模式 是 “我发到频道,谁爱听谁听”,强调灵活性和解耦。这又让我想到了,类似于TCP与UDP通信的区别。就这样吧,讲完了。实践是检验真理的唯一标准。光看可能云里雾里的,实际场景中用到了,就知道了。两者在代码实现上有相似之处(遍历列表触发回调)。但它们的核心区别不在于数据结构(List 或 Map),而在于设计思想和应用场景。
2025-04-17 18:28:55
970
原创 【Vue】从 MVC 到 MVVM:前端架构演变与 Vue 的实践之路
在软件开发中,架构模式是解决代码组织,职责分离和可维护行的核心方案。一个"好"的架构可以少很多不必要的麻烦。这个"好"就很关键,虽然架构模式经历了从MVC——>MVP——>MVVM的演变,但是,不一定后者比前者好。比方说:你一个小项目,MVC就够用了,非要去使用MVP,MVVM,就会多写很多无用代码。先说概念:Vue.js是mvvm模式集大成者,通过响应式系统和申明试模板,简化了数据绑定。但是,还是需要结合实际项目去选择。18年MVVM刚兴起的时候,就写过一篇三者的区别的文章。回顾了一下,感觉还是适用的。
2025-04-16 18:59:48
1160
原创 【Vue】v-if和v-show的区别
特性v-ifv-showDOM 存在性条件为false,不存在始终存在,仅隐藏初始渲染开销低(false时不渲染,无开销)高(始终渲染)切换开销高(触发重排)低(触发重绘)适用场景条件不频繁变化条件频繁变化v-if 通过销毁/重建 DOM 控制显示,适合不频繁切换的场景;v-show 通过 CSS 隐藏元素,适合频繁切换的场景。
2025-04-14 19:00:46
467
原创 JS—防抖和节流:1分钟掌握防抖和节流
特性防抖节流执行时机高频事件结束后,规定时间内执行高频事件按照频率执行适用场景输入框,提交按钮等滑动事件,动画渲染极端情况持续触发,不会执行持续触发时,函数按规律执行合并多次操作为一次,适合“最终状态”场景(如输入停止后搜索)。稀释执行频率,适合持续高频事件(如滚动事件)。推荐使用Lodash的方法,不需要自己手动去写,了解防抖节流的原理即可。
2025-04-10 20:32:36
274
原创 JS—同源策略:2分钟掌握同源策略
什么时同源策略?它是浏览器的一种安全机制,用于限制不同源的网页脚本或文档之间的交互,以防止恶意程序获取用户隐私协议或跨站攻击。同源策略,同源策略,那什么是同源呢?只有不同源才有这个限制,所以同源很重要。说同源之前,先讲一下URL的组成:如下URL组成:协议+域名+端口号+路径+参数。举个栗子:协议(Protocol):https域名(Domain):www.haichenyi.com端口号(Port):8080 端口号是可选的。
2025-04-10 18:30:26
981
原创 JS—浏览器的缓存策略:3分钟精通浏览器缓存策略
强制缓存(Cache-Control) → 快速响应,减少请求。协商缓存(ETag/Last-Modified) → 精准验证资源更新。合理配置缓存策略可显著提升 Web 应用性能,但需注意避免因缓存导致内容更新延迟问题。
2025-04-09 19:05:48
1135
原创 JS—什么是npm?一分钟了解npm
分层架构操作系统(文件、网络、进程)↓V8 + libuv(JavaScript 执行与异步 I/O)↓Node.js(模块、文件、网络 API)↓npm(依赖管理、脚本执行、缓存)↓应用层(用户项目、全局工具)。
2025-04-08 18:40:23
130
原创 JS—图片格式:1分钟掌握图片选择
将多个小图标或图片合并成一张大图,通过 CSS background-position 定位显示特定区域。将图片数据编码为文本格式(Data URI),直接嵌入 HTML/CSS/JS 文件中,无需单独请求图片文件。
2025-04-02 19:01:10
469
原创 JS—页面渲染:1分钟掌握页面渲染过程
简单来说:假设解析器在解析一段CSS的时候,发现某个规则可能与后续规则冲突(例如选择器优先级或继承关系不明确),需要回退到之前解析的状态,尝试另一种解析路径,这种"试错"行为称之为回溯。
2025-04-02 18:24:03
959
原创 JS—Token与JWT
JWT全称:**JSON Web Token,**是一种轻量级、自包含的开放标准。以 JSON 格式存储数据,并通过数字签名(如 HMAC 或 RSA)或加密保证信息的完整性和可信性,常用于身份认证(如登录 Token)和跨系统数据交换。无论选择哪种方式,XSS漏洞均可导致Token泄露,因此防范XSS是核心。对于极高安全场景,可考虑将Token存入内存,并在页面刷新时重新认证。后续请求怎么给服务端,也是没有绝对的标准,一般token都是放在网络请求的Cookie里面或者Header里面。
2025-04-01 18:37:40
1074
原创 JS—存储方式:1分钟掌握存储方式
存储方式容量有效期自动传给服务器典型用途Cookie4kb可设置过期时机自动带在请求头中登录态,用户偏好5-10M永久有效(除非手动删除)不自动长期保存的用户设置5-10M当前标签页有效(关闭后失效)不自动临时数据IndexDB几百M永久有效(除非手动删除)不自动离线应用,复杂的数据结构按需分配可控制(需手动清理)不自动缓存网络资源一句话选择指南- 想自动传数据给服务器 → 用 Cookie(比如用户登录凭证)。
2025-04-01 18:15:48
287
原创 JS—Promise:原理解析
Promise 的核心是 状态管理 + 回调队列 + 链式调用。手写实现需注意:状态不可变异步回调的执行顺序链式调用中返回新 Promise错误冒泡机制通过实现一个简化版 Promise,你能更深刻理解 JavaScript 异步编程的设计思想。实际开发中,请直接使用原生 Promise。
2025-03-31 13:24:27
1350
原创 JS—Promise:3分钟掌握Promise
JavaScript ES6新增的Promise是用于处理异步编程的对象,它解决了传统回调地狱的问题。掌握 Promise 是理解现代 JavaScript 异步编程的关键,结合 async/await 可以写出更简洁、健壮的代码。等待所有的promise都执行完成,不论是成功还是失败,都要等待所有的都执行完。取第一个改变状态的promise的值,可以是成功,也可以是失败。等待所有的promise成功,或者其中一个失败。所有的promise都成功,则走成功回调。创建一个失败的promise。
2025-03-27 18:35:50
600
原创 JS—深拷贝与浅拷贝:2分钟掌握二者的区别
维度浅拷贝深拷贝独立性部分独立(仅顶层属性独立)完全独立内存占用低(共享嵌套对象)高(完全独立副本)开发成本低(原生支持)高(需处理循环引用,特殊对象)适用性简单数据复杂数据优先使用浅拷贝,除非明确需要深拷贝。深拷贝应谨慎用于大型对象(性能敏感场景)。
2025-03-26 19:44:02
836
原创 JS—call,apply,bind:1分钟掌握三者的区别
这里还遇到了另一个小插曲,我注册这个容器的方法是在父类中写的,我直接在父类的构造方法里面去初始化容器。我在项目启动的时候,通过容器存储我有哪些方法,说白了就是一个map,key是方法名,value是方法。H5给我方法名的时候,我通过map去获取,获取到了就说明有这个方法,没获取到就说明没有。我第一个版本这些方法全都写的静态,静态方法会有一个问题,那就是我如果启动了两个webview,只有一个对象去通信,理论上是有问题。而是,直接方法()执行的。这样,就会在执行方法的时候,this指向的不是我实际的对象。
2025-03-25 19:34:46
934
原创 JS—ES5与ES6:2分钟掌握ES5与ES6的区别
- ES6 解决了 ES5 的诸多痛点(如作用域、异步、代码冗余),引入了现代语言特性。- 兼容性:旧浏览器可能不支持ES6,通常需通过Babel等工具转译为ES5。- 开发体验:ES6使代码更简洁、可维护性更高,是当前开发的主流选择。基本上前面博客都或多或少提到过这些不同点的内容。比方说异步处理,前面一篇就说过了异步编程的原理。Promise回调会放到微任务队列中回调等等。
2025-03-25 18:46:31
540
原创 JS—异步编程:3分钟掌握异步编程
可能,CPU干了0.1秒的任务A,然后干0.2秒的任务B。再回到本篇的开头,JavaScript的异步编程,就可以理解为,单核CPU的并发,通过时间片的轮转方式去调度任务。可能,你会说1分钟都学不到东西了,更别说1秒,1毫秒了,能学什么东西?诶,这就是区别,机器能记住上一次执行的状态,下次再接着执行,不要杠,不接受反驳。以上,我说的都是单核,也就是1个CPU,现在手机,电脑都是4核,8核。,并行才能我们所理解的"并发",才是真正的并发。那么,问题就来了,这个并发,多线程是怎么实现的呢?
2025-03-24 19:39:06
1064
4
原创 JS—script标签加载:1分钟掌握async与defer
DOMContentLoaded是浏览器提供的一个关键事件,它标致着HTML文档解析完成且DOM树构建完毕(无需等待样式表和外部资源加载完毕)。通过合理使用 async 和 defer,可显著提升页面加载性能,同时确保脚本逻辑正确性。async与defer都是用于优化脚本加载行为的html属性。
2025-03-24 18:12:57
985
原创 JS—this指向与new操作符:2分钟搞懂new操作符的具体实现
new操作符用于通过构造函数创建对象的实例。它的核心作用时将构造函数与原型链关联,自动处理对象初始化的过程。
2025-03-19 19:48:05
379
原创 JS—基本数据类型和引用数据类型:1分钟掌握两者的区别
特性基本数据类型引用数据类型存储位置栈内存堆内存赋值行为值拷贝地址拷贝比较方式值比较地址比较参数传递值传递地址传递。
2025-03-18 18:52:34
386
原创 JS—垃圾回收机制:5分钟掌握Java和JavaScript垃圾回收机制
因为我是Android出身,当初学的Java语言,对Java的垃圾回收机制比较熟悉。并且,JavaScript V8引擎的垃圾回收机制与Java的垃圾回收机制类似。这里的士兵可以看作一个对象,入伍就是被new出来了,退伍就是被gc回收了。具体的算法实现不同。说到垃圾回收机制,就想到之前Android的java的垃圾回收机制,),这个时候,就需要大清洗了,新兵营,军管区都需要清理,给人空出位置来(我就不像说Java的垃圾回收机制那样,说的那么细了。),士兵无法晋升了,就要搞事情了,需要清理那些不干事的军官(
2025-03-14 17:39:04
994
原创 JS—闭包:3分钟从入门到放弃
闭包:能够访问外部函数作用域的函数,以及其词法环境的组合。// 被闭包捕获的变量return function() {//内部大括号count += 1;// 1// 2上面这个例子,有两个方法,一个是外部的createCounter方法,一个是内部的return 的方法。外部createCounter方法定义了一个变量count内部return的方法,使用了这个变量,让这个变量+1,然后返回。我们都知道内部可以访问外部变量,这是没有问题的。
2025-03-12 19:56:02
365
原创 JS—如何判断数据类型:全能判断方式Object.prototype.toString.call()
b. 引用类型:优先使用 Object.prototype.toString.call()。功能:允许对象自定义 Object.prototype.toString 返回的标签。返回结果:格式为 [object Xxx](如 [object Array])。无法区分数组、对象、日期等引用类型(均返回 “object”)。a. 基本类型:使用 typeof(注意 null 的陷阱)。无法区分 null(返回 “object”)和对象类型。适用于检测所有数据类型(包括基本类型和引用类型)。
2025-03-11 19:25:28
693
原创 JS—内置对象:3分钟掌握Symbol
可枚举性检查:仅遍历 enumerable: true 的属性(通过 Object.defineProperty 或直接赋值定义的属性默认可枚举)常用的内置对象,只是简单的说一下,最想说的还是Symbol,面试问道的频率高。仅遍历字符串键:for…in 只处理属性名为字符串的键,忽略 Symbol 键。作用于对象时,symbol的键不会隐式的转为字符串,避免命名冲突。每个symbol的值都是唯一的,即使他们的描述也相同,如下。继承属性:从原型链继承的可枚举属性。自身属性:对象直接定义的属性。
2025-03-10 20:01:27
524
原创 JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作
JavaScript是一种轻量级、解释型或即时编译型的编程语言,广泛用于Web开发。
2025-03-06 19:32:27
437
原创 CSS—属性继承与预处理器:2分钟掌握预处理器
他们的样式放的位置都有一定的规律,A,B他俩是平级的,a1,a2,a3是平级的,他们属于A样式所在的元素的子元素的样式。还有for循环,我没有写,我感觉我们之所以用这个,就是为了简单,方便维护。看上面这个图,我给parent的样式class设置了字体和颜色,为什么内部子view的字体和颜色也发生了改变呢?下面再说一个嵌套规则的例子:一个页面有两个子view,两个子view又分别有各自的子孙view,他们样式都不一样。回忆一下,项目里面,给父view设置的属性,子view不需要设置,也会有相同的属性的。
2025-03-05 19:44:16
1048
原创 CSS—重绘与重排:10秒掌握重绘与重排
什么属性改变布局呢?比方说:宽高,position,display,border,padding,margin等等。什么情况加触发重绘?什么情况下触发重排呢?不要死记硬背,要理解。什么属性改变样式呢?比方说:颜色,背景,透明度等等。
2025-03-04 19:18:59
388
原创 CSS—px与rem:3分钟掌握rem适配原理
rem是相对于根元素(即元素)的字体大小而言的相对长度单位。它不受元素字体大小和父元素字体大小的影响,只受根元素字体大小的影响。
2025-03-04 18:57:12
1186
原创 CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法
为啥写的时候会写一句是否会挂载到dom树上,因为,我们使用vue中的v-if,v-show的时候,使用v-if时,元素压根就不会挂载到dom树上,v-show会挂载到dom树上(display:none),可能刷新页面的时候会存在bug,需要重新渲染,需要使用v-if。比方说,你家房子,地上一层,地下一层地下室。把标签的透明度设置为0,也就是全透明,用户看不到,标签也就隐藏了。标签会挂载在html中,但是不会在页面上显示,会占用页面的空间。标签会挂载在html中,但是不会在页面上显示,会占用页面的空间。
2025-03-01 20:25:09
1024
原创 CSS—选择器详解:5分钟动手掌握选择器
类选择器,需要申明到标签上,它的优先级高于标签选择器,小于ID选择器。属性选择器按照匹配规则分为:包含属性选择器,等于属性选择器,起始属性选择器,结尾属性选择器,子串属性选择器。一共有五类选择器:基础选择器,组合选择器,属性选择器,伪类选择器,伪元素选择器。基础选择器分为四类:元素选择器(标签选择器),类选择器,ID选择器,通配符选择器。组合选择器分为:后代选择器,子选择器,相邻兄弟选择器,普通兄弟选择器,群组选择器。伪类选择器大体可以分为三类:动态伪类选择器,结构伪类选择器,表单伪类选择器。
2025-03-01 17:33:19
1182
BufferTextInputLayout的简单用法
2017-03-28
基于SystemBarTint、BottomNavigationBar实现的一个简单的项目框架
2017-03-18
MyApplication.rar
2019-05-24
MVP+Dagger.Android+LiveData+RxJava2.0+Retrofit2.0+OkHttp
2018-12-10
Dagger.Android+LiveData搭的简单的项目框架
2018-12-04
MyProject8
2018-03-01
CoordinatorLayout的常见用法4种
2017-09-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人