Vue学习笔记二

标签: Vue 分类: 杂文 创建时间:2020-08-28 07:19:19 更新时间:2023-10-20 11:23:26

1.index.html中引入外部资源

1.1使用script标签

在index.html模板文件中,引入外部资源,首先遇到的问题就是外部资源的路径问题。在router为hash模式下,使用相对目录引入外部js文件没有问题,但是如果是history模式,那么路由就有可能嵌套好几层,再次使用相对目录的方式进行引入,就会出现问题。

比如上面的路径,要使用一个点,引入项目根目录下的lib文件夹下的RSA/RSA.js,就会出现问题。

1
<script type="text/javascript" src="./lib/RSA/RSA.js"></script>

使用一个点,其实引入的就是list/lib/RSA/RSA.js,但是这个路径下是没有这个文件的。使用两个点也不合适,但是直接使用一个斜杠,到网站的根目录又不行,如果项目不是部署在服务器的根目录而是一个虚拟目录的化,引入服务器根路径的资源就会出错。

解决方式就是在.env.development和.env.production等环境变量的配置文件中,添加变量:VUE_APP_BASE_URL=”http://localhost:8080/",然后在index.html中使用<%= VUE_APP_BASE_URL %>的方式进行引入。必须要定位为VUE_APP_开头,否则可能不生效。

1
<script type="text/javascript" src="<%= VUE_APP_BASE_URL %>/lib/RSA/RSA.js"></script>

根据参考文章3中的描述,BASE_URL - 会和 vue.config.js 中的 publicPath 选项相符,即你的应用会部署到的基础路径。

参考文章:
1.我要怎么在index.html设置BASE_URL
2.HTML 和静态资源 (这里官方说可以使用的变量有<%= BASE_URL %>,可以设置链接的前缀,但是我没有发现这个BASE_URL设置位置)
3.环境变量和模式 (这里讲了如何通过环境变量文件设置不同环境下的引入值)
4.Vue 中如何引入第三方 JS 库 (在vue.js中引入外部js文件的四种方式)
5.vue-cli 3.0配置webpack目录别名alias

1.2使用import

可以直接在一个vue文件中使用import进行外部文件的导入,vue就会将该文件进行打包,如果要忽略打包,就要使用上面的script标签的方式进行引入。

1
2
3
// 加载Shape文件
import "../../../public/lib/mxGraph/Graph";
import "../../../public/lib/mxGraph/Shapes";

必要时在外部文件代码顶部添加一行注释,避免进行eslint检查

1
/* eslint-disable */ 
参考文章:
1.解决vue单页文件引入外部js的问题 (讲了三种方法,就是在main中引入,使用es6语法和使用script标签)
2.针对单个 js 文件禁用 ESLint 语法校验

2.route的history本地配置

如果使用线上模式,就要配置route的mode为history,这个配合后台的nginx,没有什么问题,但是本地开发的时候,如果也配置为history,那么在子路由中,刷新页面就会出现:chunk-vendors.js:1 Uncaught SyntaxError: Unexpected token ‘<’ 错误,找不到要加载的js文件

解决方法

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
const path=require("path")

module.exports={
publicPath: process.env.NODE_ENV === 'production'?'/phemswebpc/':"/",
devServer: {
historyApiFallback: true
},
configureWebpack:{
resolve:{
alias:{
"@":path.join(__dirname,"./src"),
"@api":path.join(__dirname,"./src/api"),
"@pages":path.join(__dirname,"./src/pages"),
"@store":path.join(__dirname,"./src/store"),
"@router":path.join(__dirname,"./src/router"),
"@components":path.join(__dirname,"./src/components"),
"@utils":path.join(__dirname,"./src/utils"),
"@assets":path.join(__dirname,"./src/assets"),
"@common":path.join(__dirname,"./src/common"),
"@lib":path.join(__dirname,"./src/lib")
}
}
}

}

有两个要注意的地方:
(1) devServer.historyApiFallback=true

(2) publicPath,注意最后的是”/“,而不是”./“,

参考文章:
1.vue-router mode=history本地开发环境配置 (这里有两种方式配置mode=history本地开发环境配置,还讲了配置了historyApiFallback还是报错的问题,就是因为把publicPath设置成了”./“)
2.vue-router history模式下本地开发如果手动刷新就会加载线上的js文件怎么办? (这里描述了问题,但是他给的解决方案是使用proxy的bypass进行解决,和我的问题有些差距)
3.devserver-proxy (这是bypass的问题和解决方法)

3.vuex存储用户信息

如何使用vuex存储用户信息,以及如何解决刷新的问题。

主要就是获取token,然后使用sessionStore进行存储。根据参考文章1中的内容,其实包括整个认证的逻辑,基本上都讲的很明白了。

参考文章:
1.使用Vuex解决Vue中的身份验证 (这篇文章中讲了如何通过vuex存储用户的信息的,以及在axios中使用store.js,包括用户认证,权限认证,用户注册登录等整个逻辑,这篇文章值得好好的看看)

4.mouted方法中无法使用computed中的属性

如下的代码显示,在mounted中打印this.configList,却发现了是一个空。

1
2
3
4
5
6
7
8
mounted() {
console.log(this.configList);
},
computed:{
configList(){
return this.$store.getters.configList;
}
},

经过多次尝试,可以使用nextTick,获取到更新后的值

1
2
3
4
5
mounted() {
this.$nextTick(()=>{
console.log(this.configList);
})
},

5.props传递对象

props在官方说法,就是单向数据流,也就是父组件修改传入的值,子组件可以同步更新,但是不能修改,修改后会报错。但是这里也是有限制的,就是子组件不能修改props的值,仅限于props是基本数据类型,如果props传入的是一个对象,你虽然不能将这个对象改变,但是可以改变这个对象的某个属性的值。官网上有这么一句话:

注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。

也就是说,你不能改变对象的指针地址,但是可以改变指针指向的内容。

如果非要严格的区分单向数据流,可以使用浅拷贝Object.assign({},obj)或者深度拷贝JSON.parse(JSON.stringify(obj)),将传入的对象进行复制,然后在复制的对象上进行处理,就不会出现子组件修改父组件的数据了。

6.动态组件

动态组件,我也经常称之为异步组件,但是看官网的说明,异步组件和动态组件其实是两个概念。其实就是在用到的时候再进行加载的组件,就类似于我们从后台请求了数据,然后数据要渲染到一个组件上,但是这个组件有没有加载或者是需要重新创建。传统的方式,其实就是获取数据后,然后手动构造html,然后插入到DOM中,这样做起来还是挺麻烦的。

动态加载的组件,还有一个问题就是如何进行传递参数的问题。

参考文章:
1.动态组件 & 异步组件 (这是官方的关于动态组件的说明)
2.vue 动态组件传参 (这里也有人在讨论动态加载组件的问题)
3.动态组件并传参数的问题 (这是上面的例子)

7.vuex的模块

(1) 调用模块的mutations

1
this.$store.commit("模块名/方法",temp);

(2) 调用模块的actions

1
this.$store.dispatch("模块名/方法",temp);
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。