Skip to content

Vue

vue

前端Vue部署nginx刷新后404

  • 查看了一下nginx配置,出现问题的配置是这样的:
bash
   server {
        listen       8088;
        server_name  localhost;
 
        location / {
            root   html/dist;
            index  index.html index.htm;
        }
        location /gateway/ {
             rewrite ^/gateway/(.*) /$1 break;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto $scheme;
             proxy_connect_timeout 5;
             proxy_pass http://192.168.0.11:9000/;
    }
  • 修改后的配置是这样的
bash
    server {
        listen       8088;
        server_name  localhost;
 
        location / {
            root   html/dist;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
        location /gateway/ {
             rewrite ^/gateway/(.*) /$1 break;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto $scheme;
             proxy_connect_timeout 5;
             proxy_pass http://192.168.0.11:9000/;
    }
  • 添加了

try_files $uri $uri/ /index.html

然后重启一下nginx问题就解决了。 解释:

try_files 表示检查文件是否存在,返回第一个找到的文件,这里设置是index.html内部重定向。 另外,还有一种404报错的问题,可能是nginx访问文件权限问题,

打开nginx.conf,第一行默认是这样的

bash
#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
以下省略
  • 可能是你访问的路径,需要root权限,而你启动nginx使用的普通用户,权限不足导致访问不到文件,所以可以这么修改:
bash
user  root;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
以下省略

页面强制刷新

首先我们知道在vue中,数据的绑定都不用我们操心,例如在data中有一个msg的变量,你修改它,那么在页面上,msg的内容就会自动发生变化。但是如果对于一个复杂的对象,例如一个对象数组,你直接去给数组上某一个元素增加属性,或者直接把数组的length变成0,vue就无法知道发生了改变。

  • 相信大家也遇到过,实际上是赋值的 界面上并不渲染
js
change: function(index) {//增加性别属性
    this.list[index].sex = '男';
},
clear: function() {//清空数组
    this.list.length = 0;
}
  • 解决方案一:this.$set()

  • 可解决这个问题 vue的规范 文档里面都有提到过

js
change: function(index) {//增加性别属性
    this.$set(this.list[index],'sex','男')
},
clear: function() {//清空数组
    this.list=[];
}
  • 解决方案一:this.$forceUpdate()
js
change: function(index) {
    this.list[index].sex = '男';
    this.$forceUpdate();
},
clear: function() {
    this.list.length = 0;
    this.$forceUpdate();
}

Vue异步更新策略

在数据发生变化时,vue不会立刻更新DOM,而是开启一个队列,把组件更新函数保存在队列中,在同一时间循环中发生的所有数据变更都保存在队列,一次性清空队列,一次性更新。

  • 解决方案 this.$nextTick(回调函数)

  • 在数据发生改变时,渲染DOM之后,会自动执行回调函数

js
this.banderList = res.data;
this.$nextTick(() => {
   new Swiper('.swiper-container', {
       pagination: '.swiper-pagination',
       paginationClickable: true,
       loop: true,
       autoplay: 4000,
       speed: 300
   });
})

Released under the MIT License.