<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[萝卜斯基先生的博客]]></title><description><![CDATA[如果你面对一个选择、一件事，一直犹豫「我做还是不做?」那就尽可能去做吧。]]></description><link>https://blog.youkuaiyun.com/luobosiji</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; luobosiji]]></copyright><item><title><![CDATA[Vue-Router基础]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/90696242</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/90696242</guid><author>luobosiji</author><pubDate>Thu, 30 May 2019 14:13:18 +0800</pubDate><description><![CDATA[Vue Router

官方的路由管理器,让构建单页面应用变得易如反掌。


传统方式

通过切换url,来切换到不同文件


SPA

通过监听URL变化,定位到同一文件的不同组件
类型

Hash模式 (不美观/无法定位锚点)
History模式(需要后端配合/IE9不兼容(使用强制刷新处理))





安装

npm install vue-router
import VueRouter ...]]></description><category></category></item><item><title><![CDATA[Vuex]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/90696216</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/90696216</guid><author>luobosiji</author><pubDate>Thu, 30 May 2019 14:12:23 +0800</pubDate><description><![CDATA[Vuex 状态管理
运行机制

Vuex 使用

npm install vuex --save
import Vuex from 'vuex'
Vue.use(Vuex)const app = new Vue({
  el: '#app',
  // 把 store 对象提供给 “store” 选项，这可以把 store 的实例注入所有的子组件
  //需调用 Vue.use(Vuex)
  s...]]></description><category></category></item><item><title><![CDATA[Vue组件跨层级获取组件实例]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/90696147</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/90696147</guid><author>luobosiji</author><pubDate>Thu, 30 May 2019 14:09:46 +0800</pubDate><description><![CDATA[this.$parent   访问父实例
this.$children 当前实例的直接子组件。(不保证顺序,不是响应式)
this.$parent.$parent.$refs.xxx 跨级访问父组件
this.$children.$children.$refs.xxx 跨级访问子组件
这种递归的方式 代码繁琐 性能低效

ref
只能获取当前组件上下文组件 无法跨层级

ref 是字符串 被用来给...]]></description><category></category></item><item><title><![CDATA[Vue组件跨层级通信]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/90696103</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/90696103</guid><author>luobosiji</author><pubDate>Thu, 30 May 2019 14:07:59 +0800</pubDate><description><![CDATA[**组件跨层级通信**]]></description><category></category></item><item><title><![CDATA[记忆 - Memoization & 优化计算]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89419980</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89419980</guid><author>luobosiji</author><pubDate>Sat, 20 Apr 2019 16:56:29 +0800</pubDate><description><![CDATA[记忆 - Memoization

主要用于加速程序计算的一种优化技术
函数可以将先前操作记录到某个对象中,从而避免无谓的重复运算

// 采用记忆方式(计算数据越大越有优势)
var memoizer = function(memo, formula) {
  var recur = function(n) {
    var result = memo[n]
    if (typeof re...]]></description><category></category></item><item><title><![CDATA[web离线应用]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89379967</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89379967</guid><author>luobosiji</author><pubDate>Thu, 18 Apr 2019 15:29:38 +0800</pubDate><description><![CDATA[离线应用

确保设备可以上网,访问一定的资源

离线检测

navigator.onLine //true 表示可以上网
//网络从离线变为在线触发
window.addEventListener('online',function(){})
//网路从在线变为离线触发
window.addEventListener('offline',function(){})


有一块本地空间用于保存数据,...]]></description><category></category></item><item><title><![CDATA[编写JavaScript实践]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89379925</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89379925</guid><author>luobosiji</author><pubDate>Thu, 18 Apr 2019 15:28:33 +0800</pubDate><description><![CDATA[最佳实践
编写可维护代码(直观性/可理解性/可适应性/可扩展性/可调试性)

代码约定

注释(增加可读性)
有意义的函数名/变量名

变量名应为名词
函数名应该以动词开头 如get… ,返回值为布尔 is…
避免无用变量名


变量类型透明(初始化指定变量类型)


松散耦合

html/JavaScript 解耦(通过外部引入)
css/JavaScript 解耦(通过修改类名 来操作样式)
...]]></description><category></category></item><item><title><![CDATA[数据存储]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89379849</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89379849</guid><author>luobosiji</author><pubDate>Thu, 18 Apr 2019 15:26:20 +0800</pubDate><description><![CDATA[数据存储
Cookie

存储限制: 4kb 20个


最初是在客户端用于存储会话信息的
在性质上是绑定在特定域名下的
当设定cookie后,在给创建它的域名发送请求时,都会包含这个cookie
所以 cookie越大完成服务器请求时间就越长

Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.co...]]></description><category></category></item><item><title><![CDATA[setTimeout&setInterval]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89348885</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89348885</guid><author>luobosiji</author><pubDate>Wed, 17 Apr 2019 09:00:03 +0800</pubDate><description><![CDATA[定时器

因为JavaScript是运行于单线程环境中,所以定时器的执行时机是不能保证的
除了主JavaScript进程外, 还有一个需要在进程下一次空闲时执行的代码队列,代码会按照执行顺序加入队列

setTimeout()

工作方式: 特定时间后将代码插入到队列中,如果在这个时间点上,队列中没有其他东西,那么就会被执行,如果有其它任务执行, 则等到其它任务执行完毕才会执行


setInte...]]></description><category></category></item><item><title><![CDATA[高级函数(函数节流&自定义事件)]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89348817</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89348817</guid><author>luobosiji</author><pubDate>Wed, 17 Apr 2019 08:53:57 +0800</pubDate><description><![CDATA[高级函数
安全类型检测

typeof
instanceof
Object.prototype.toString.call(value) == "[object Array]"toString() 方法只能检测原生对象

惰性载入函数

函数执行的分支只会加载一次

//方法一:
function fun(){
  if(tureOrFalse){
    fun = function(){
  ...]]></description><category></category></item><item><title><![CDATA[Ajax&XMLHttpReuqest&跨域]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89336973</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89336973</guid><author>luobosiji</author><pubDate>Tue, 16 Apr 2019 16:55:21 +0800</pubDate><description><![CDATA[XMLHttpReuqest

Ajax核心技术 简称XHR

//不考虑兼容性
var xhr = new XMLHttpRequest(); 
//监听响应 每当 readyState（存有 XMLHttpRequest 的状态）改变时，就会触发 onreadystatechange 事件。
xhr.onreadystatechange=function(){ 
    if (xhr.rea...]]></description><category></category></item><item><title><![CDATA[理解对象&原型链实现继承 porortype __proto__]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89316604</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89316604</guid><author>luobosiji</author><pubDate>Mon, 15 Apr 2019 17:27:46 +0800</pubDate><description><![CDATA[理解对象&amp;继承
创建对象的两种方式

new Object()
字面量  {}

对象的属性类型

数据属性(包含数据值)

数据属性的特性

configurabale true 能否delete 或修改数据特性(只能修改一次)
enumerable true 能否通过for-in遍历
writable true 能否改值
value  undefined 值




访问器属性(不包含...]]></description><category></category></item><item><title><![CDATA[Function]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89293144</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89293144</guid><author>luobosiji</author><pubDate>Sun, 14 Apr 2019 09:54:25 +0800</pubDate><description><![CDATA[Function 类型
函数声明与函数表达式

代码开始执行之前,解析器就通过函数声明提升将函数声明添加到执行环境中
函数表达式不存在函数声明提升 因为函数位于初始化语句中

fun() //正常执行
function fun(){
  //这是函数声明
}
fun2() //报错 'unexpected identifier' 意外标识符
var fun2 = function(){
  //这...]]></description><category></category></item><item><title><![CDATA[Array usage]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89292938</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89292938</guid><author>luobosiji</author><pubDate>Sun, 14 Apr 2019 09:30:19 +0800</pubDate><description><![CDATA[Array类型

如何确定某个对象是不是数组 ？

value instanceof Array  一个全局作用域下使用
Array.isArray()  多个全局作用域下使用（如多个框架）


栈方法
通过push() + pop()数组可以表现的像栈一样，先进后出

push() 方法在数组末尾添加数据
pop() 方法从数组末尾移除数据

队列方法
通过shift() + unshift()...]]></description><category></category></item><item><title><![CDATA[JavaScript 执行环境]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/89292572</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/89292572</guid><author>luobosiji</author><pubDate>Sun, 14 Apr 2019 08:16:13 +0800</pubDate><description><![CDATA[JavaScript 执行环境
每个执行环境都关联一个变量对象，环境中定义的所有变量和函数都保存在这个对象中

定义了变量或函数有权访问的其它数据
在web浏览器中，全局执行函数被认为是window对象

全局执行环境（最外围的执行环境）直到应用程序退出才会销毁（关闭网页）


每个函数都有自己的执行环境

当执行流进入一个函数时，函数的环境会被推入环境栈中
函数执行之后，栈将其环境推出，把控制前...]]></description><category></category></item><item><title><![CDATA[自定义导航栏pop动画(push同理)]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/52790240</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/52790240</guid><author>luobosiji</author><pubDate>Tue, 11 Oct 2016 17:49:52 +0800</pubDate><description><![CDATA[参考推荐文章http://www.cocoachina.com/ios/20150717/12600.html首先创建一个导航控制器 并获取控制器的手势识别器->获取视图->在视图上添加新建的拖拽手势->最后实现监听 //获取手势识别器
 UIGestureRecognizer *gesture = self.interactivePopGestureRecognizer;
 //禁用
    ge]]></description><category></category></item><item><title><![CDATA[iOS导航栏返回手势]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/52779810</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/52779810</guid><author>luobosiji</author><pubDate>Mon, 10 Oct 2016 17:31:50 +0800</pubDate><description><![CDATA[心血来潮 整理了一下关于UINavigationController的一些总结首先来说一些细节问题: 
1. 系统默认的返回按钮例如如果是从首页跳转则 
如果跳转的页面title过长则为 
如果我们想更改文字的话可以在导航栏栈中的上一级中进行如下设置 
(例图中 从首页跳转到1控制器  则在首页中进行设置)// 更改文字为返回(如果想去掉文字 则title输入空字符串)
self.navigatio]]></description><category></category></item><item><title><![CDATA[CALayer&Core Animation核心动画]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/52212790</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/52212790</guid><author>luobosiji</author><pubDate>Mon, 15 Aug 2016 17:04:07 +0800</pubDate><description><![CDATA[CALayer和UIView的关系CALayer负责视图中显示的内容和动画 
UIView负责监听和响应事件 
UIView本身不具备显示的功能，是它内部的层才有显示功能//创建图层
    CALayer *layer = [CALayer layer];
    layer.backgroundColor = [UIColor redColor].CGColor;
    layer.frame]]></description><category></category></item><item><title><![CDATA[drawRect方法&贝塞尔路径&上下文]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/52209292</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/52209292</guid><author>luobosiji</author><pubDate>Mon, 15 Aug 2016 10:59:15 +0800</pubDate><description><![CDATA[drawRect方法使用注意事项:drawRect在以下情况下会被调用： 
1、如果在UIView初始化时没有设置rect大小，将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给]]></description><category></category></item><item><title><![CDATA[触摸事件&传递&手势&故事板小发现]]></title><link>https://blog.youkuaiyun.com/luobosiji/article/details/52088079</link><guid>https://blog.youkuaiyun.com/luobosiji/article/details/52088079</guid><author>luobosiji</author><pubDate>Mon, 01 Aug 2016 18:29:24 +0800</pubDate><description><![CDATA[只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”//一根或者多根手指开始触摸view，系统会自动调用view的下面方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//一根或者多根手指在view上移动，系统会自动调用view的下面方法（随着手指的移动，会持续调用该方法）
- (vo]]></description><category></category></item></channel></rss>