Vue学习笔记二
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 | // 加载Shape文件 |
必要时在外部文件代码顶部添加一行注释,避免进行eslint检查
1 | /* eslint-disable */ |
2.route的history本地配置
如果使用线上模式,就要配置route的mode为history,这个配合后台的nginx,没有什么问题,但是本地开发的时候,如果也配置为history,那么在子路由中,刷新页面就会出现:chunk-vendors.js:1 Uncaught SyntaxError: Unexpected token ‘<’ 错误,找不到要加载的js文件
解决方法
1 | const path=require("path") |
有两个要注意的地方:
(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 | mounted() { |
经过多次尝试,可以使用nextTick,获取到更新后的值
1 | mounted() { |
1.关于在Vue生命周期钩子中无法获取数据的一些理解 (这是一个问题发现的过程,还是需要进行调试)
2.Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
3.vue系列—理解Vue中的computed,watch,methods的区别及源码实现(六)
4.vue.js 2 how to watch store values from vuex (使用watch和computed确实可以解决部分问题)
5.VUE-解决无法监听数组、对象的变化 (这篇文章有很多的说明,如何监听数组的变化以及对象的变化)
5.props传递对象
props在官方说法,就是单向数据流,也就是父组件修改传入的值,子组件可以同步更新,但是不能修改,修改后会报错。但是这里也是有限制的,就是子组件不能修改props的值,仅限于props是基本数据类型,如果props传入的是一个对象,你虽然不能将这个对象改变,但是可以改变这个对象的某个属性的值。官网上有这么一句话:
注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。
也就是说,你不能改变对象的指针地址,但是可以改变指针指向的内容。
如果非要严格的区分单向数据流,可以使用浅拷贝Object.assign({},obj)或者深度拷贝JSON.parse(JSON.stringify(obj)),将传入的对象进行复制,然后在复制的对象上进行处理,就不会出现子组件修改父组件的数据了。
6.动态组件
动态组件,我也经常称之为异步组件,但是看官网的说明,异步组件和动态组件其实是两个概念。其实就是在用到的时候再进行加载的组件,就类似于我们从后台请求了数据,然后数据要渲染到一个组件上,但是这个组件有没有加载或者是需要重新创建。传统的方式,其实就是获取数据后,然后手动构造html,然后插入到DOM中,这样做起来还是挺麻烦的。
动态加载的组件,还有一个问题就是如何进行传递参数的问题。
7.vuex的模块
(1) 调用模块的mutations
1 | this.$store.commit("模块名/方法",temp); |
(2) 调用模块的actions
1 | this.$store.dispatch("模块名/方法",temp); |
1.vuex分模块后调用方法
2.vuex中的mutations的两种调用方法_程序员徐小白的博客-程序员宅基地_mapmutations方法调用
3.Vuex,state、mutations、actions调用的两种方法_沃德韦泰帅了的博客-程序员宅基地
8.provide/inject
使用provide提供的数据失去了响应式了,如果需要的话,可以提供相应数据,或者以函数的形式进行提供。
父组件
1 | const apiMixin = { |
子组件
1 | computed: { |
【1】.VUE2中的依赖注入provide/inject如何实现响应式? 1.传入响应式数据:vue2虽然不能像vue3那样创造响应式数据ref、reactive,但vue2的this就是个响应式数据。如果我们直接在父元素中提供依赖this,那么后代组件就能获得响应式。2.以函数式的方式传入:父组件中以函数式的方式提供依赖,后代组件中采用函数的方式调用。
【2】.vue2–provide/inject 的使用及思考 provide/inject中绑定的数据并不是可响应的,若要实现响应需要传递一个可监听对象,并注意该对象的应用不能发生变化。
【3】.Vue2.x 中,通过provide和inject实现祖孙组件传值 1.传入响应式数据;2.以函数式的方式传入
【4】.vue2中provide/inject的使用和响应式传值 这里用了 computed 进行了缓存。使用provide 和 inject 可以实现祖孙组件之间的通信;通常这两个属性要一起使用;祖先组件通过 provide将需要向子孙组件传递的值return 出去;然后子孙组件通过inject注入依赖;不管层级有多深,都可以使用祖先组件传递过来的数据以及方法。祖孙组件的传值,一般用于多层级的关系当中,使用便捷。
9.动态挂载组件
我有一个需求就是如何将一个组件动态的挂载到组件上,将infowindow挂载到地图上去。
1 | /** |
【1】. Vue动态创建组件实例并挂载到body 这里写了两种方法,一种使用了: const comp = new (Vue.extend(Component))({ propsData: props }).$mount(),document.body.appendChild(comp.$el)。一种使用了 render 函数进行了渲染。
【2】.vue自定义组件如何挂载到body上 这里简单的使用了 render 函数
【3】.Vue2笔记_01创建vdom并挂载到dom元素上 render函数的作用是将 createElemet 函数创建的vdom返回到Vue实例化对象的beforeMount生命周期函数中;然后通过挂载点进行挂载然后将vdom渲染在界面上(真实dom)。若是createElement的第一个参数为html标签的字符串-> 创建一个对应的html标签的vdom并将这个标签渲染到挂载点上(createElement创建$mount函数挂载渲染);
【4】.Vue笔记_挂载点(el+$mount) 通过上述流程图可以看出$el的优先级高于 $mount,若是同时出现以 $el为准
【5】.vue的动态组件-component