代码之家  ›  专栏  ›  技术社区  ›  ItsPronounced Finn

vuejs-npm run dev webserver auto refresh在保存文件时起作用,但刷新浏览器时不起作用

  •  1
  • ItsPronounced Finn  · 技术社区  · 6 年前

    我注意到很奇怪的是,如果我正在工作,并且我将我的工作保存在IDE(vscode)中,并且localwebserver刷新我的页面,我就会看到我的代码中预期会发生什么。但是,如果再次单击浏览器中的“刷新”,则没有任何效果。一个很好的例子是在我的一个组件中,我正在构建一个数组用于我的下拉控件。我正在输出用于填充下拉列表的数组 console.log() 为了确保它能像我希望的那样工作,当我把文件保存在vscode中时,它会在浏览器中正确地输出数据。如果我立即在浏览器中刷新我的页面,它不会像刚才那样输出数组,而是看到 [__ob__: Observer] 用一个 length:0 由于控制台.log(). 它也不会填充我的下拉列表。。这是预期的行为吗?

    App.vue ,其中有3个分量 应用程序.vue . 我正在填充一个名为 fans 使用json数据(在我的 mounted() 应用程序.vue

    <template>
      <div>
          <fan-modals v-bind:fans="fans"></fan-modals>
    
          <div class="container">
              <filter-controls v-bind:fans="fans"></filter-controls>
              <fans v-bind:fans="fans"></fans>
          </div>  <!-- end #container -->
      </div>
    </template>
    
    <script>
      import FilterControls from './components/FilterControls.vue';
      import Fans from './components/Fans.vue';
      import FanModals from './components/FanModals.vue';
    
      export default {
        name: 'app',
        data: function() {
          return {
            fansUrl: 'example.com',
            fans: []
          }
        },
        components: {
          filterControls: FilterControls,
          fans: Fans,
          fanModals: FanModals
        },
        methods: {
        },
        mounted() {
            var self = this;
            $.getJSON(self.fansUrl, function(data){
                self.fans = data;
            });
        }
    }
    </script>
    

    给我问题输出的组件是我的 FilterControls 组件,如图所示(为了简洁起见,我省略了所有其他控件):

    <template>
    
            <div class="row">
                <div class="col-xs-6 col-sm-6 control-wrap">
                    <select id='selectVoltage' class='form-control' v-model="voltageArray">
                    <option>Voltage</option>
                    <option v-for="(voltage, index) in voltageArray" :key="index" v-bind:value="voltage">
                        {{ voltage }}
                    </option>
                    </select>
                </div>
                <div class="col-xs-6 col-sm-6 control-wrap">
                    <select id='selectMaxRPM' class="form-control">
                    <option>Max RPM</option>
                    </select>
                </div>
            </div>
            </template>
    
    <script>
        export default {
            data: function() {
                return {
                    voltageArray: [],
                }
            },
            props: {
                fans: {
                    type: Array,
                    required: false
                }
            },
            methods: {
                populateControls() {
                    var vi = this;
                    console.log("populateControls() called ");
                    if (vi.fans) {
                        console.log("there are fans ");
    
                        var voltage = [];
    
                        $.each(vi.fans, function(index, value) {
                            voltage.push(vi.fans[index].voltage);
    
                        });
    
                        vi.voltageArray = $.unique(voltage);
    
                        console.log(vi.voltageArray);
                    }
    
                }
            },
            mounted() {
                this.populateControls();
            }
        }
    </script>
    

    我将用于填充表的数组作为道具传递给组件。

    当我保存我的工作,并在浏览器中自动刷新它的工作。当我在浏览器中刷新页面时,它不会。我很困惑。

    1 回复  |  直到 6 年前
        1
  •  1
  •   tony19 steve    6 年前

    这是比赛条件。安装的时间 <filter-controls> $.getJSON 会有所不同。在您看到预期输出的情况下,网络响应很可能在 <过滤器控制>

    我相信在你的情况下,网络的反应是在 <过滤器控制> 装载和日志 fans (基于网络响应)。以后你再编辑, webpack-dev-server 热重新加载,浏览器在加载之前获取缓存的网络响应(没有网络请求) <过滤器控制>

    demo of bug

    你也可以在你的沙盒里证明这一点 disabling the cache 在Chrome的开发工具中。

    最好不要假设在安装组件时道具数据可用。相反,使用 watcher 要对道具更改作出反应:

    export default {
      mounted() {
        // this.populateControls(); // DON'T DO THIS
      }
      watch: {
        fans(value) { // <-- called whenever fans prop changes
          this.populateControls(value);
        }
      },
      methods: {
        populateControls(fans) {
          console.log('new fans', fans);
        }
      }
    }
    

    还要注意的是 v-model <select> 应保持选定电压的值,而不是 voltageArray <option> s、 你应该加一个 data 所选电压专用变量:

    <!-- <select v-model="voltageArray">  // DON'T DO THIS -->
    <select v-model="selectedVoltage">
    

    demo of fix