1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
例子: let cols = document.querySelectorAll('ul li') [].forEach.call(cols, function (col, index) { // TODO } 分析: ① []是一个空数组,无论这个数组里的最初值是什么,它们都不会被使用到; ② forEach方法是一个数组方法,只有数组才能调用;完整写法:Array.prototype.forEach,Array.forEach为简写; ③ call方法: 语法:fun.call(thisArg, arg1, arg2, ...) 参数:thisArg:在 fun 函数运行时指定的this值; arg1, arg2, ... : 指定的参数列表; 综上:[]这个空数组里的值(当然,它没有值)是最初的this值,通过call方法,当这个空数组调用方法forEach时, cols里的值会取代空数组原先的this值。 通俗的说,就是cols需要使用forEach这个方法, 但是这个方法是一个数组方法,只有数组才能调用,于是通过call方法来了个偷梁换柱, 在数组调用forEach方法的时候,将数组里的this值替换成了cols的值,达成了目的。 |
作者:SKILLNULL
使用WebDriverAgent中遇到的问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
首先克隆:git clone https://github.com/facebook/WebDriverAgent.git 在执行命令: ./Scripts/bootstrap.sh 时报错: Please make sure that you have Carthage installed (https://github.com/Carthage/Carthage) Note: We are expecting that carthage installed in /usr/local/bin/ 安装carthage:brew install carthage 执行 ./Scripts/bootstrap.sh 仍报同样的错,再次安装carthage提示: Warning: carthage 0.27.0 is already installed, it's just not linked. You can use `brew link carthage` to link this version. 执行:brew link carthage 报: Linking /usr/local/Cellar/carthage/0.27.0... Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks 提权:sudo brew link carthage 报: Error: Running Homebrew as root is extremely dangerous and no longer supported. As Homebrew does not drop privileges on installation you would be giving all build scripts full access to your system. 原因可能是我刚把系统升级到 macOS High Sierra 10.13.2 搜到一大把解决方法: 1、sudo chown -R $(whoami) $(brew --prefix)/* 2、sudo chown -R $(whoami) /usr/local/* 3、brew upgrade 4、Uninstall Homebrew: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)" Then re-install it: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 第四个没试,前三个都试了一遍,brew link carthage仍然报错,但是 ./Scripts/bootstrap.sh 可以执行了。 依赖安装完以后,双击WebDriverAgent.xcodeproj这个文件,会在Xcode中对应打开。 紧接着证书签名: 勾选 Automatically manage signing 然后选择Team 登录你的 Apple ID 下载证书。 在TARGETS里面选中WebDriverAgentLib: <img src="http://skillnull.com/wp-content/uploads/2018/01/131514876676_.pic_hd-1.jpg" alt="" width="1878" height="1057" /> 在TARGETS里面选中WebDriverAgentRunner: <img src="http://skillnull.com/wp-content/uploads/2018/01/141514876772_.pic_hd.jpg" alt="" width="1878" height="1057" /> 报错了,修改BundleID: <img src="http://skillnull.com/wp-content/uploads/2018/01/111514876450_.pic_hd.jpg" alt="" width="1878" height="1057" /> <img src="http://skillnull.com/wp-content/uploads/2018/01/121514876645_.pic_.jpg" alt="" width="626" height="19" /> <img src="http://skillnull.com/wp-content/uploads/2018/01/151514877046_.pic_hd.jpg" alt="" width="1878" height="1057" /> 报错解决。 接着在菜单栏中选择Product=>Destination=>你的手机,Product=>Scheme=>WebDriverAgentRunner,最后Product=>Test 运行。 |
Mac系统从10.12 macOS Sierra更新到10.13.2macOS High Sierra后执行git命令报错
解决React首屏加载白屏的问题
webpack 3.8 使用 extract-text-webpack-plugin 3.0 抽取css失败:You may need an appropriate loader to handle this file type.
1 2 3 4 5 6 7 8 9 10 11 12 |
webpack 3.8.1 使用 extract-text-webpack-plugin 3.0.2 抽取css时失败,报错: ERROR in ./src/static/style/localTime.css Module parse failed: Unexpected token (1:0) You may need an appropriate loader to handle this file type. | .localTimeBox { | color: red; | } @ ./node_modules/style-loader!./src/static/style/localTime.css 4:14-42 webpack-build.config.js 配置为: |
1 2 3 4 5 6 7 8 9 10 11 |
module: { loaders: [ { test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader', 'style-loader!css-loader', {publicPath: '../'}) } ] }, plugins: [ new ExtractTextPlugin('css/bundle.min.css', {allChunks: true}) ] |
解决方法:
将webpack-build.config.js 配置改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
module: { loaders: [ { test: /\.css$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: ['css-loader'], publicPath: '../' }) } ] }, plugins: [ new ExtractTextPlugin('css/bundle.min.css', {allChunks: true}) ] |
问题就解决了。[……]
Cannot resolve symbol ‘Component’ & Cannot resolve symbol ‘PropTypes’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import React, { Component, PropTypes } from 'react' 报错:Cannot resolve symbol 'Component' Cannot resolve symbol 'PropTypes' 1.解决 Cannot resolve symbol 'Component' 安装依赖:npm install @types/react --save 调用方法:import React, { Component } from 'react' 2.解决 Cannot resolve symbol 'PropTypes' 安装依赖:npm install prop-types --save 调用方法:import PropTypes from 'prop-types' 注:React.PropTypes 自 React v15.5 起已弃用。请使用 prop-types 库代替。 |
React & Redux 的一些基本知识点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
一、React.createClass 跟 React.Component 的区别在于后者使用了ES6的语法,用constructor构造器来构造默认的属性和状态。 1. React.createClass import React from 'react'; const Contacts = React.createClass({ render() { return ( <div></div> ); } }); export default Contacts; 2.React.Component import React from 'react'; class Contacts extends React.Component { constructor(props) { super(props); } render() { return ( <div></div> ); } } export default Contacts; 二、 Super(props) 调用父类的构造函数,react希望把所有props,state的定义尽量放到父类中进行。 子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象, 而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。 三、容器组件 Container Components 和展示组件 Presentational Components -------------------------------------------------------------------------- | 展示组件 | 容器组件 -------------------------------------------------------------------------- 作用 | 描述如何展现(骨架、样式) | 描述如何运行(数据获取、状态更新) -------------------------------------------------------------------------- 直接使用Redux | 否 | 是 -------------------------------------------------------------------------- 数据来源 | props | 监听 Redux state -------------------------------------------------------------------------- 数据修改 | 从 props 调用回调函数 | 向 Redux 派发 actions -------------------------------------------------------------------------- 调用方式 | 手动 | 通常由 React Redux 生成 -------------------------------------------------------------------------- <strong>四、connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])</strong> 连接 React 组件与 Redux store。连接操作不会改变原来的组件类,而是返回一个新的已与 Redux store 连接到组件类。 1.[mapStateToProps(state, [ownProps]): stateProps] (Function): 如果定义该参数,组件将会监听 Redux store 的变化。只要 Redux store 发生变化,mapStateToProps函数就会被调用。 该回掉函数必须返回一个纯对象,这个对象与组件的props合并。如果省略了这个参数,组件将不会监听 Redux store。 如果指定了第二个参数 ownProps,则该参数的值为传递到之间的props,而且只要组件接收到新的 props, mapStateToProps也会被调用。 2.[mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function): 如果传递的是一个对象,那么每个定义在该对象的函数都将被当作 Redux action creator, 对象所定义的方法名将作为属性名;每个方法将返回一个新的函数,函数中dispatch方法会将action creator的返回值作为参数执行。 这些属性会被合并到组件的 props 中。如果传递的是一个函数,该函数将接收一个 dispatch 函数,然后由你来决定如何返回一个对象, 这个对象通过 dispatch 函数与 action creator 以某种方式绑定在一起(提示:你也许会用到 Redux 的辅助函数 bindActionCreators())。 如果你省略这个 mapDispatchToProps 参数,默认情况下,dispatch 会注入到你的组件 props 中。 如果指定了该回调函数中第二个参数 ownProp该参数的值为传递到组件的 props,而且只要组件接收到新 props,mapDispatchToProps 也会被调用。 3.[mergeProps(stateProps, dispatchProps, ownProps): props] (Function): 如果指定了这个参数,mapStateToProps() 与 mapDispatchToProps() 的执行结果和组件自身的 props 将传入到这个回调函数中。 该回调函数返回的对象将作为 props 传递到被包装的组件中。你也许可以用这个回调函数,根据组件的 props 来筛选部分的 state 数据, 或者把 props 中的某个特定变量与 action creator 绑定在一起。如果你省略这个参数,默认情况下返回 Object.assign({}, ownProps, stateProps, dispatchProps) 的结果。 4.[options] (Object): 如果指定这个参数,可以定制 connector 的行为。 [pure = true] (Boolean): 如果为 true,connector 将执行 shouldComponentUpdate 并且浅对比 mergeProps 的结果, 避免不必要的更新,前提是当前组件是一个“纯”组件,它不依赖于任何的输入或 state 而只依赖于 props 和 Redux store 的 state。默认值为 true。[withRef = false] (Boolean): 如果为 true,connector 会保存一个对被包装组件实例的引用, 该引用通过 getWrappedInstance() 方法获得。默认值为 false。 |
react-router 3 中的 useRouterHistory(createHistory) 到了 react-router 4 变成了什么?
react-router 3 文档: https://github.com/ReactTraining/react-router/blob/v3/docs/API.md
react-router 4 文档: https://reacttraining.com/react-router[……]
react-router 4 文档: https://reacttraining.com/react-router[……]
一个 React & Redux的目录树
React & Redux
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
Project | |-- node_modules | | | |-- react | | | |-- react-dom | | | |-- react-router | | | |-- react-redux => redux本身只能处理同步的Action | | | |-- react-thunk => 在我们没有加上thunk这个中间件之前, | | store的dispatch方法只能传入一个action对象, | | thunk的作用就是能够让我们可以将一个function方法传入diptach, | | 这在做异步的时候非常有用。 | | | |-- redux-promise => redux-promise支持将promise对象作为参数传入dispatch中。 | | | |-- prop-types => React.PropTypes 自 React v15.5 起已弃用。 | | 请使用 prop-types 库代替。调用方法: | | import PropTypes from 'prop-types' | | | |-- @types/react => implements method in React.Component,解决 | | Cannot resolve symbol 'Component' 的问题 | | | |-- postcss-loader => PostCSS,一款通过 JS 插件转换 styles 样式的工具。 | | 根目录下新建postcss.config.js文件。配置如下: | | module.exports = { | | parser: 'sugarss', | | plugins: { | | 'postcss-import': {}, | | 'postcss-cssnext': {}, | | 'cssnano': {} | | } | | } | | webpack配置:{ | | test: /\.css$/, | | use: ['style-loader', 'css-loader','postcss-loader'] | | } | | | |-- Autoprefixer => PostCSS插件,一个后处理程序。解析CSS并添加浏览器前缀。 | | postcss.config.js文件中配置如下: | | module.exports = { | | plugins: [ | | require('autoprefixer')({}) | | ] | | } | | | |-- extract-text-webpack-plugin => 将css单独打包成一个文件。 | | 它会将所有的入口 chunk(entry chunks)中引用的 *.css, | | 移动到独立分离的 CSS 文件。因此,你的样式将不再内嵌到JS bundle中, | | 而是会放到一个单独的 CSS 文件(即 styles.css)当中。 | | 如果你的样式文件大小较大,这会做更快提前加载,因为 CSS bundle | | 会跟 JS bundle 并行加载。 | | | |-- optimize-css-assets-webpack-plugin => 压缩抽离后的css代码, | | plugins: [new OptimizeCssAssetsPlugin()] | | | |-- html-webpack-plugin => 该插件将为您生成一个HTML5文件, | | 其中包括使用script标签的body中的所有webpack包。 | | | |-- copy-webpack-plugin => 在webpack中拷贝文件和文件夹。例如: | | new CopyWebpackPlugin([ | | {from: "./src/static/images", to: 'images/'} | | ]) | | 作用就是将 ./src/static/images | | 目录下的图片拷到编译目录到 images 文件夹下面 | | | |-- rimraf => 编译前清空dist目录。package.json配置: | | "scripts": {"build": "rimraf dist && ..."} | | | |-- OpenBrowserPlugin => webpack编译后自动打开浏览器 | | | |-- axios => 一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中 | | | |-- babel-eslint => 一个Babel parser的包装器,这个包装器使得Babel parser可以和ESLint协调工作 | | .eslintrc.js中配置:"parser": "babel-eslint", | | "parserOptions": { | | "sourceType": "module", | | "allowImportExportEverywhere": false, | | "codeFrame": false | | } | | | |-- webpack | | | |-- webpack-dev-middleware | | | |-- webpack-hot-middleware | |-- dist => 打包输出文件目录 | |-- src | | | |-- actions => Action是把数据从应用传到 store 的有效载荷。 | | 它是 store 数据的唯一来源,一般通过 | | store.dispatch() 将 action 传到 store。 | | | |-- reducers => Action只是描述了有事情发生了这一事实, | | 并没有指明应用如何更新 state。 | | reducer 用来做更新state这个动作。 | | | |-- store => 1.维持应用的state; | | 2.提供 getState() 方法获取 state; | | 3.提供 dispatch(action) 方法更新state; | | 4.通过 subscribe(listener) 注册监听器; | | 5.通过 subscribe(listener) 返回的函数注销监听器。 | | | |-- components => 展示型组件目录 | | | |-- containers => 容器型组件目录 | | | |-- config => 配置actionType、接口 | | | |-- library => 插件库 | | | |-- service => 服务配置 | | | |-- static => 静态文件目录 | | | |-- main.js => 入口文件 | |-- webpack => webpack配置目录 | |-- .babelrc => Bable的配置文件,用来设置转码规则和插件。 | Babel是一个广泛使用的ES6转码器, | 可以将ES6代码转为ES5代码。 | |-- .gitignore => git上传忽略特殊文件配置 | |-- index.html | |-- README.md | |-- package.json => 定义了这个项目所需要的各种模块,以及项目的配置信息。 | |-- package-lock.json => npm5.0后新增。记录了整个 node_modules | 文件夹的树状结构,当重新安装模块的时候, | 速度加快。但是,生成pack-lock.json后, | 重复执行npm install时将会以其记录的版本来安装。 | 这时如果手动修改 package.json 中的版本, | 重新安装也不会生效,只能手动执行npm install | 命令指定依赖版本来进行修改。 | | |-- yarn.lock => yarn.lcok文件是自动产生的, | 和package-lock.json的功能一样, | 只不过yarn可以做到手动更改package.json后, | 重新安装并更新lockfile。 |
vue中使用 echarts3.0 或 echarts2.0
一、echarts3.0(官网: http://echarts.baidu.com/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
首先通过npm安装echarts依赖,安装的为3.0版本 npm install echarts -s 也可以使用淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install echarts -s 引入的方式有两种: 1、main.js中全局引入 import echarts from 'echarts' Vue.prototype.$echarts = echarts 然后在组件中通过 this.$echarts.init(document.getElementById('your_div')) 来初始化 2、只应用基本包,加快加载速度 在需要使用echarts的组建中引入: let echarts = require('echarts/lib/echarts') 然后通过 echarts.init(document.getElementById('your_div')) 来初始化 使用的话就比较简单,直接将官方实例封装一个为方法,在mounted中调用即可。 |
二、 echarts2.0(官网: http://echarts.baidu.com/echarts2/)
[crayon-674282da[……]