76-一道运算符优先级面试题
1 | var test={a:1} |
正常来说,应该是 test={b:2}
先执行,但是这里访问属性、调用方法运算符”.”的优先级高于赋值运算符
,所以运算顺序是
1 | test.th=test |
75-箭头函数的this
箭头函数里不但没有 this,也没有 arguments, super ……
“箭头函数”的this,总是指向定义时所在的对象,而不是运行时所在的对象。
1 | function foo(){ |
请问,上面代码的{id: 42},到底是箭头函数定义时所在的对象,还是运行时所在的对象?
你认为,答案是后者。这是不对的。
因为,这个例子中,箭头函数位于foo函数内部。只有foo函数运行后,它才会按照定义生成,所以foo运行时所在的对象,恰好是箭头函数定义时所在的对象。
19-子组件根据父组件更新状态而变化
一. 问题
在Topdev的分页组件的开发的时候,当前页数和总页数是父组件传给分页组件的,即代码中的m_totalPage和m_curPage
1 | <Paginationer :totalPage="m_totalPage" :curPage="m_curPage" v-on:getLatestList="onPageClick"></Paginationer> |
如果在Paginationer.vue中直接使用curPage,会报如下错误:
1 | [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value |
避免在子组件中直接使用父组件传递过来的值,以免修改之后,出现意外情况。简而言之,需要把这个值赋到子组件中,即在Paginationer.vue做如下操作:
1 | data () { |
这样就可以解决报错问题,但是会引发另外的问题: 当父组件中m_totalPage
和m_curPage
发生变化的时候,Paginationer.vue中的值不会跟着变化。
二. 解决办法
在Paginationer.vue中用watch监听curPage这个变量
1 | watch: { |
这样就能使者两个量保持同步。
74-地图坐标体系说明
WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。
GCJ02:又称火星坐标系,是由中国国家测绘局制定的地理坐标系统,是由WGS84加密后得到的坐标系。
BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
12-vux环境搭建
1. 采用 vux2 模板
1 | npm install vue-cli -g # 如果还没安装 |
建议在安装的时候询问是否安装elsint,选择Y,如果想关闭在config/index.js里把 useEslint 改为false。配合vscode的eslint校验很有用。 参考链接
2. 安装sass-loader
1 | cnpm i node-sass -D |
3.引入flex.js
1 | <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"> |
4.配置路由
views文件夹存放页面组件
- 在router目录下新建两个文件,==_import_development.js== 和 ==_import_production.js==,
1 | //_import_development.js -> |
5.配置开发环境和生产环境api
5.1 配置不同环境的请求网址
- 在config文件夹下 dev.env.js 里添加
BASE_API: '"https://api-prod"'
- 在config文件夹下 prod.env.js 里添加
BASE_API: '"https://api-prod"'
5.2 在src目录下新建一个api文件夹,写api,方便后期维护
5.3 proxyTable解决跨域
在/config/index.js文件dev.proxyTable里配置index.js,
1 | proxyTable: { |
同时将 config文件夹下 dev.env.js 里 BASE_API:
参数设置为'"/yxAPI"'
6.增加styles文件夹,写scss
6.1 公用样式写在src/styles/mixin.scss和src/styles/common.scss
6.2 组件样式写在单文件scoped里,覆盖公用样式请用deep
6.2.1 添加依赖
1 | npm install sass-resources-loader --save-dev |
6.2.2 修改build/utils.js
1 | scss: generateLoaders('sass').concat( |
6.3 开发前须知:
1 | /** |
7.自动加载components组件
视情况看设置不设置
/src/components/componentRegister.js
1 | import Vue from 'vue' |
文件结构
1 | components |
这里对组件名做了判断,如果是index的话就取组件中的name属性处理后作为注册组件名,所以最后注册的组件为:multi-condition、basic-table
最后我们在main.js中==import ‘components/componentRegister.js’==,然后我们就可以随时随地使用这些基础组件,无需手动引入了~
全局注册方式必须在(通过 new Vue 创建的)Vue 根实例创建之前置入组件
注:VUX全局组件也可以创建一个js文件集中引入,在main.js中import引入
8. 写常用util方法
8.1 utils/auth.js –Token设置文件
Web端:(可采用下面一种方案)
1 | import { cookie as Cookies } from 'vux' |
APP端:(兼容IOS某些机型不支持cookie存储)
1 | import { cookie as Cookies } from 'vux' |
8.2 utils/request.js –Ajax请求配置文件
8.3 设置 vuex user.js
8.2 8.3见项目代码
8.4 登录状态验证流程说明
9 封装SVG Icon组件
安装
svg-sprite-loader
1
cnpm i svg-sprite-loader -D
修改 /build/webpack.base.conf.js
1 | /*---------- 注释原有loader ----------*/ |
- 新建 src/icons 文件夹
1 | icons |
index.js
1 | import Vue from 'vue' |
10 主题颜色配置
为了配合项目主题颜色,有必要修改vux weui的主题色,方便项目复用,修改文件在build/webpack.base.conf.js,在vux的plugins选项中补充,然后在src/styles/ 下增加 theme.less
请配置vux-loader的less-theme插件,指定用以覆盖的less文件路径:
1 | { |
11 修改build生成项目中css,js引用路径
在/config/index.js里找到 build.assetsPublicPath, 修改为 assetsPublicPath: './',
12 修改host地址让局域网内的其他机器访问
在 package.json 里找到 script.dev ,在后面添加上 --host 0.0.0.0
13 更改eslint规则
基本流程如上,后面写业务代码~
15-弹性布局小坑
1
1 | display: none; |
二者一齐出现时,display弹性布局要在后面才不会被覆盖掉。
2. 弹性布局针对的是display:block的元素
3. 图文布局: 文章的div,需要设置 min-width:0
1 | .news-item__bd{ |
4. 平均排列
1 | .discount__bd { |
如果是2列,则不用加empty元素
1 | .side__bd{ |
21-jq事件中的this和event.target
jq中this
和event.target
的区别:
1.js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远指向触发事件的DOM元素本身;
2.this和event.target都是dom对象,使用jQuey中的方法可以将他们转换为jquery对象:$(this)和$(event.target).
event.target表示发生点击事件的元素;
this表示的是注册点击事件的元素。
有些时候 event.target 与 this 相等,即$(this) =$(event.target)
1 不代理事件时
不代理事件时,当前 谁注册了事件,this就指向谁
1 | $("body").on("click",function(e){ |
2 代理事件时
代理事件时,e.target == this
1 | $("body").on("click",".a",function(e){ |
34-IOS中Fixed元素包含输入框时的解决方案
1.fixed问题
使用 position: fixed; 来固定父容器(模态框)在页面中的位置,父容器(模态框)中包含一个或多个 input 输入框的子节点:
在 IOS 上,在键盘被唤起时,由于模态框绝对定位,导致输入框焦点乱跑,输入不正常等问题:
软键盘唤起后,页面的 fixed 元素将失效(即无法浮动,也可以理解为变成了 absolute 定位),所以当页面超过一屏且滚动时,失效的 fixed 元素就会跟随滚动了,因此我们需要使用相对定位进行布局。
在移动端开发中,针对 IOS 及 Android 滚动兼容问题,尽量做局部滚动,不要做全局滚动。
2. 微信页面当打开输入法时,固定底部的按钮被顶上去的解决办法
可以设置当页面高度小于某个数值时底部的按钮自动隐藏
1 | #butt { |
22-vscode配置终端路径出错解决办法
1.svn插件安装
Windows
If you use TortoiseSVN, make sure the option Command Line Tools is checked during installation and C:\Program Files\TortoiseSVN\bin is available in PATH.
安装前要检查一下 TortoiseSVN
bin目录下是否有 svn.exe
,默认安装是没有的,需要重新安装一次,配置Command Line Tools
安装到本地。
2.配置终端路径出错解决办法
由于刚安装svn插件时,终端提示我没有找到svn路径,我随便加了个tortoiseproc.exe,导致终端每次打开默认记住了这个路径。
修改办法:
先修改一下 svn.exe
还有 tortoiseproc.exe
文件名,让终端再次打开的时候找不到路径弹出提示,然后我们再重命名回文件名,在终端搜索正确路径即可。