盒子
盒子
文章目录
  1. promise兼容IE11
  2. Vue提倡的单项数据流
  3. 关于node中的module.exports、exports和ES6中的 export、export default

工作小结-2

promise兼容IE11

最近我开发的公司的竞赛网站被发现在IE11下排行榜无数据,但是在其他浏览器没问题,我然后打开控制台一看,发现了如下错误:

Promise未定义

真是醉了,然后发现有三个可行的方案:

  • 直接采用polyfill
1
2
3
在index.html中
<script src = "https://cdn.polyfill.io/v2/polyfill.min.js"></script>
或 <script type="text/javascript" src ="https://cdn.polyfill.io/v2/polyfill.min.js?features=es6"></script>
  • 手写js脚本判断一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/javascript">
function isIE() {
if (!!window.ActiveXObject || "ActiveXObject" in window) {
return true;
} else {
return false;
}
}
if (isIE()) {
var script = document.createElement('script');
script.type = 'text/javaScript';
script.src = 'js/bluebird.min.js'; // bluebird 文件地址
// http://cdn.jsdelivr.net/bluebird/3.5.0/bluebird.min.js
document.getElementsByTagName('head')[0].appendChild(script);
}

</script>
  • 安装新的依赖
1
2
3
4
5
6
7
8
1、npm install --save babel-polyfill
2、在main.js文件的顶部引入 import "babel-polyfill"
3、在build目录下webpack.config.js文件设置入口改为如下
(如果你的项目用的是脚手架,在在build目录下webpack.base.config.js文件更改入口)
model.exports={
entry:{
app: ["babel-polyfill",'./src/main.js']
}

Vue提倡的单项数据流

在写vue组件的过程中,经常会遇到这样的情形:子组件需要的参数以props属性里面的prop来获得,父组件通过具名的prop来把子组件需要的内容传递给子组件,而且Vue提倡数据流的方向只能由父组件流向子组件。当父组件的数据发生变化时去通知子组件更改相应的属性,而不能反过来,子组件的变化影响到父组件,这种行为是被禁止的,因为这样会导致数据混乱不易于定位错误。

虽然经常写着写着子组件就想图省事,子组件直接去改变父组件的状态了,但是会报错如下:

Props只允许父组件传递给子组件

那么,子组件为了更改父组件的状态,Vue提供了两种常见的解决办法:

  • 通过data中的变量将需要的prop初始化
1
2
3
4
5
6
props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}
  • 使用需要处理的prop来定义一个计算属性computed
1
2
3
4
5
6
props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}

当然子组件要想和父组件去进行通信,也可以简单的采用如下方式

  • $emit触发事件,父组件接受子组件发布的事件,然后就顺理成章的在父组件里面修改自身的变量了。

关于node中的module.exportsexports和ES6中的 exportexport default

node中,每个文件都被视为一个独立的模块,对外只暴露一个接口(其实就是一个对象):module.exports

module代表当前模块,它的exports属性负责与外界进行交流,加载一个外来的模块就是加载该模块的module.exports属性的内容。

1
2
3
4
5
6
7
8
9
10
11
12
// add.js
var temp = 1;
var addNumber = function (value) {
return value + 1;
};
module.exports.temp = temp;
module.exports.addNumber = addNumber;
// 另一个js文件引用了add.js
var add = require('./add.js')
console.log('add is', add) // add is { temp: 1, addNumber: [Function: addNumber] }
console.log(add.temp) // 1
console.log(add.addNumber(1)) // 2

通常为了方便,每个node模块头部有默认的一句话:var exports = module.exports

为了方便可以直接在exports对象上加方法,也可以实现对外的改变,但是不可以将exports变量指向其它变量,一旦这样做了会切断exportsmodule.exports之间的联系。

但是,node采用了CommonJs规范,ES6采用新规范importexport (对应于requireexports)

1
2
3
4
5
6
7
8
9
//ES6 example.js
var temp = 'temp'
export {temp} //同样的,export出来的只是一个接口,必须有大括号,除非使用下面介绍的export default
//export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。通俗来讲,不能使固定的值,应该是一个变量或者一个函数
// use example
import {example} from './example.js'
console.log(example.temp) // 'temp'
// 同样的,ES6也有默认的export写法
export default var temp = 'new'