vue-cli分析打包后的文件

与 webpack-bundle-analyzer 有关,由于 vue-cli3 中已经集成了这个包,所以只需要在控制台输入

  1. yarn build --report

在打包后的 dist 文件夹中找到 report.html ,打开后即可查看打包后的文件报告。
image.png

axios 配置不同的 Content-Type

axios 进行 POST 请求时默认的 Content-Type 是 application/json 。这时,如果我们想要 Content-Type 是其它类型的时候,应该如何配置呢?

application/x-www-form-urlencoded
a.[用 URLSearchParams 传递参数]

  1. let param = new URLSearchParams()
  2. param.append('username', 'admin')
  3. param.append('pwd', 'admin')
  4. axios({
  5. method: 'post',
  6. url: '/api/lockServer/search',
  7. data: param
  8. })

b. 配置 axios 请求头中的 content-type 为指定类型

  1. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

或者

  1. {headers: {'Content-Type': 'application/x-www-form-urlencoded'}}

将参数转换为 query 参数,利用 qs ,这个库是 axios 里面包含的,不需要再下载了。

  1. import Qs from 'qs'
  2. let data = {
  3. "username": "cc",
  4. "psd": "123456"
  5. }
  6. axios({
  7. headers: {
  8. 'Content-Type': 'application/x-www-form-urlencoded'
  9. },
  10. method: 'post',
  11. url: '/api/lockServer/search',
  12. data: Qs.stringify(data)
  13. })

multipart/form-data

  1. let params = new FormData()
  2. params.append('file', this.file)
  3. params.append('id', this.id)
  4. params.append('username', this.name)
  5. axios.post(URL, params. {
  6. headers: {'Content-Type': 'multipart/form-data'}
  7. }).then(res => {
  8. console.log(res)
  9. })

application/json
这种是 axios 默认的请求数据类型,我们只需将参数序列化 json 字符串进行传递即可,无需多余的配置。

数据改变了视图不变化

Vue无法检测实例被创建时不存在于 data 中的 property

例子:

  1. var vm = new Vue({
  2. data: {},
  3. // 页面不会变化
  4. template: '<div>{{message}}</div>'
  5. })
  6. vm.message = 'Hello!' // vm.message 不是响应式的

解决办法:

  1. var vm = new Vue({
  2. data: {
  3. message: '',
  4. },
  5. template: '<div>{{ message }}</div>'
  6. })
  7. vm.message = 'Hello!'

this.$set 的使用

根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。
所以,如果我们想通过添加属性触发视图更新,需要用到 this.$set() 方法,即 Vue.set() 或者 vm.$set()

下面举个例子来更好的说明:

  1. <template>
  2. <div>
  3. <div v-for="(item, index) in dataList" :key="index">
  4. <input v-if="item.status === 'edit'" v-model="item.name" />
  5. <span v-else>{{item.name}}</span>
  6. <button @click="handleEdit(item)">编辑</button>
  7. </div>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. dataList: [{ name: "test1" }, { name: "test2" }, { name: "test3" }]
  15. };
  16. },
  17. methods: {
  18. handleEdit(data) {
  19. // 方式一:这种方式不触发视图更新
  20. // data.status = "edit";
  21. // 方式二:要用 this.$set() 才会触发视图的更新
  22. this.$set(data, "status", "edit");
  23. }
  24. }
  25. };
  26. </script>

从上面的例子中可以看出,我想通过点击编辑按钮改变数据项的状态,通过判断 datastatus 属性来实现。但是 data 中本来没有 status 属性,这时我们通过代码中的方式一无法达到视图的更新,需要用方法二的方式才可以更新视图。
具体的使用方法可以查看 Vue的官方文档

参考文章:

给点击事件添加参数

我们平时写点击事件是这样子的:

  1. <Button @click="handleClick"></Button>
  2. <script>
  3. export default {
  4. methods: {
  5. handleClick(data) {
  6. // data 为事件对象
  7. }
  8. }
  9. </script>

如果我们想要传递自定义参数:

  1. <Button @click="handleClick('hello')"></Button>
  2. <script>
  3. export default {
  4. methods: {
  5. handleClick(data) {
  6. // data 为 hello
  7. }
  8. }
  9. </script>

如果我们想要又传递事件对象,又传递自定义参数,就要像下面这样写:

  1. <Button @click="handleClick($event, 'hello')"></Button>
  2. <script>
  3. export default {
  4. methods: {
  5. handleClick(event, data) {
  6. // event 为事件对象
  7. // data 为 hello
  8. }
  9. }
  10. </script>

还有一种方法:

  1. <Button @click="event => { handleClick(event, 'hello') }"></Button>
  2. <script>
  3. export default {
  4. methods: {
  5. handleClick(event, data) {
  6. // event 为事件对象
  7. // data 为 hello
  8. }
  9. }
  10. </script>

Vue的请求接口放在哪个生命周期

可以在钩子函数 created 、 beforeMount 、 mounted 中进行调用,因为在这三个钩子函数中,data 已经创建,可以将服务端返回的数据进行赋值。
但是推荐在 created 钩子函数中调用异步请求,因为在 created 钩子函数中调用异步请求有以下优点:

  • 能更快获取到服务端数据,减少页面 loading 时间;
  • ssr 不支持 beforeMount 、 mounted 钩子函数,所以放在 created 中有助于一致性。

但是如果想请求之后进行 DOM 操作的话,必须在 mounted 阶段发起请求。

重新部署打包后的项目页面没有更新

当我们更新一些修改到服务器上时,再到浏览器中想要看效果的时候,发现还是没有修改成功,这时需要清浏览器缓存才可以看到效果。
为什么会这样呢?
在 Chrome 面板中我看到我修改后的 index.html 还是旧的,自然引用的 js 、css 也是旧的。
image.png
表示该 html 文件被缓存了。这时我在 html 文件设置禁止被缓存:

  1. <meta http-equiv="Expires" content="0" />
  2. <meta http-equiv="Pragma" content="no-cache" />
  3. <meta http-equiv="Cache-control" content="no-cache" />
  4. <meta http-equiv="Cache" content="no-cache" />

但是页面还是被缓存了。为什么呢?

因为我们只关注了客户端,却忽略了服务器端的设置,如果服务器端设置了 Cache-control ,它是会覆盖掉我们页面中设置的 Cache-control 的。
如果是用 nginx 做服务器,可以:

  1. location = /index.html {
  2. add_header Cache-Control "no-cache, no-store";
  3. }

componentOptions

componentOptions 可以通过 vnode.componentOptions 来访问,用来挂载部分组件选项来使用的。包括 { Ctor, tag, propsData, listeners, children } 。非组件的 componentOptions 为空。
作用:

  • 可以用来判断当前的 vnode 是不是组件。
  • 可以用来获取组件的名称。