0%

泰国

落地签

我是飞到曼谷素万那普机场,下机后跟着人流直走,头上有指示牌,可以一路走到办理落地签的地方。
办理落地签有两个通道,一个普通通道,一个快速通道。快速通道 2200🐖,普通通道 2000🐖。
建议走快速通道,能省很多时间。

阅读全文 »

工作

年初,公司经历大的变动,整个理财业务线都干掉了,一大批人转岗的转岗、离职的离职。前端技术部这里,人也走了几个,六楼本来 5 个前端,最后只剩下了 3 个。原来的项目也都不做了,开始做的新的项目网易白条。风风火火做了将近一年,现在产品的数字还比较好看,年后就会上公开申请制对外正式开放,前景还是不错的。

只是,现在楼上两个前端年后又要走一个人,流动性那么大,没有一点归属感。加上阿里很多部门给我打电话让我过去面试,想想网易不怎么高的工资,有时候都有点动心,但还是一一拒绝了。起码在网易待满三年,好好沉淀一下。也磨练一下自己的性子,否则天天换工作,也不利于长久的职业发展。只是最近新上的区块链项目,虽然我没参与,但能让我感觉整个部门非常的浮躁,又在犹豫呆下去是否是正确的。

生活

今年整体上还是过的像一碗白开水,中间偶有放点糖,但很快也就没有味道。

身体上已经明显能感觉到开始横向发展了,体重上了五六公斤,但是身体素质却下降了,引体向上只能做一个,我的天呐,大学的时候好歹也能轻松做十个的,这衰减的也太快了。说要锻炼身体,然而基本上只停留在嘴上,锻炼一次中间能间隔一个月,哈哈。

有时候觉得无聊,就想给自己培养个爱好,想来想去最后决定学个口琴,投入小,见效快。然后就买琴网上找教程,刚开始的几个月,还比较上心,基本天天练习,到现在不复杂的曲子都可以吹,而且自我感觉还不错。就是因为学的是布鲁斯口琴,低音的 6 需要压音,到现在也不能很好的压出好听的声音,更别提融入到曲子中去了,还需要继续练习啊。现在最喜欢的吹的曲子有两个,一个是 《alone》 一个是 《you are my sunshine》,心情不好的时候就自己吹给自己听。

日本旅游

11 月左右,公司组织我们出国旅游,有三个地方可选:日本、塞班岛、澳洲。最后我选了日本,也是第一次出国,还是很开心。

去了北海道,日本的大农村,第一天入住的小镇下午五点大街上就一个人都没有了,跟同事出逛了一圈最后发现酒店附近的居酒屋七点以后开门。一群人进去想去感受日本当地的居酒屋文化,只是老板就一个人,而且跟我们语言不通,完全照顾不过来,看起来有点不是很开心的样子,不过我们喝的倒是很开心。

第二天去的第一个景点就是个动物园,这也是我第一次去动物园,看到了企鹅、狼、海豹、河马、长颈鹿,就是出来的时候差点掉队找不到组织。

后来又去了北海道厅、洞爷湖、熊厂、地狱谷、当天晚上入住的洞爷湖酒店环境真好。

中间还去了哪都忘了,最后落脚在札幌市区,然后第二天自由活动。白天逛街买东西,几个大商场同事们都买了好多东西,都是土豪啊,哈哈。

期间有件很意思的事情,我想买个 SONY 1000x ,结果和售货员就这个耳机的输入电压是多少沟通了好久,用各种翻译软件都不行,说英语不行、说汉语也不行。

阅读全文 »

介绍

引用 MDN 的介绍:

IndexedDB 是一个事务型数据库系统,类似于基于 SQL 的 RDBMS。 然而不同的是它使用固定列表,IndexedDB是一个基于JavaScript的面向对象的数据库。 IndexedDB允许您存储和检索用键索引的对象; 可以存储structured clone algorithm支持的任何对象。 您只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务中的数据。

IndexedDB 是一种低级API,用于客户端存储大量结构化数据(包括, 文件/ blobs)。该API使用索引来实现对该数据的高性能搜索。虽然 Web Storage 对于存储较少量的数据很有用,但对于存储更大量的结构化数据来说,这种方法不太有用。IndexedDB 提供了一个解决方案。

区别

这是我整理的 WebStorage 和 indexedDB 的之间区别,有问题的地方还请指出。

用法

1. 打开数据库 

阅读全文 »

当我们在开发 React 项目中,第一次调用 ReactDOM.render 的时候都发生了什么呢?
今天就从源码角度来追踪一下这个问题(主要看流程, 而不纠结与细节)。

ReactDOMStackEntry

首先我们可以从 ReactDOM 的入口文件 ReactDOMStackEntry.js 中找到 render 方法。可以看到,render 方法是 ReactMount 组件提供的。

var ReactDOMStack = {
findDOMNode: findDOMNode,
render: ReactMount.render,
unmountComponentAtNode: ReactMount.unmountComponentAtNode,
version: ReactVersion,

/* eslint-disable camelcase */
unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,
unstable_renderSubtreeIntoContainer: ReactMount.renderSubtreeIntoContainer,
/* eslint-enable camelcase */

__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
// For TapEventPlugin which is popular in open source
EventPluginHub: require('EventPluginHub'),
// Used by test-utils
EventPluginRegistry: require('EventPluginRegistry'),
EventPropagators: require('EventPropagators'),
ReactControlledComponent: require('ReactControlledComponent'),
ReactDOMComponentTree,
ReactDOMEventListener: require('ReactDOMEventListener'),
ReactUpdates: ReactUpdates,
},
};

ReactMount.render

render: function(nextElement, container, callback) {
return ReactMount._renderSubtreeIntoContainer(
null,
nextElement,
container,
callback,
);
},

又调到了 _renderSubtreeIntoContainer 方法, 这个方法核心内容如下:

阅读全文 »

这个模块的代码非常简单,短短十几行。

var ReactElement = require('ReactElement');

var invariant = require('fbjs/lib/invariant');
function onlyChild(children) {
invariant(
ReactElement.isValidElement(children),
'React.Children.only expected to receive a single React element child.',
);
return children;
}

module.exports = onlyChild;

就是判断传入的 children 是不是一个合法的 React 元素,否则就抛错出来。判断的逻辑就在 ReactElement 模块里面:

ReactElement.isValidElement = function(object) {
return (
typeof object === 'object' &&
object !== null &&
object.$$typeof === REACT_ELEMENT_TYPE
);
};
阅读全文 »