如何在页面加载时调用vue.js函数


96

我有一个有助于过滤数据的功能。我在v-on:change用户更改选择内容时使用,但我甚至需要在用户选择数据之前调用该函数。我已经对AngularJS以前的使用做过同样的事情,ng-init但我知道在vue.js

这是我的功能:

getUnits: function () {
        var input = {block: this.block, floor: this.floor, unit_type: this.unit_type, status: this.status};

        this.$http.post('/admin/units', input).then(function (response) {
            console.log(response.data);
            this.units = response.data;
        }, function (response) {
            console.log(response)
        });
    }

blade文件中,我使用刀片表单来执行过滤器:

<div class="large-2 columns">
        {!! Form::select('floor', $floors,null, ['class'=>'form-control', 'placeholder'=>'All Floors', 'v-model'=>'floor', 'v-on:change'=>'getUnits()' ]) !!}
    </div>
    <div class="large-3 columns">
        {!! Form::select('unit_type', $unit_types,null, ['class'=>'form-control', 'placeholder'=>'All Unit Types', 'v-model'=>'unit_type', 'v-on:change'=>'getUnits()' ]) !!}
    </div>

当我选择一个特定的项目时,这工作正常。然后,如果我单击所有让我说的all floors,它就会起作用。我需要的是页面加载后,它将调用getUnits$http.post使用空输入执行的方法。在后端中,我以某种方式处理了请求,如果输入为空,它将提供所有数据。

我该怎么做vuejs2

我的代码:http//jsfiddle.net/q83bnLrx

Answers:


195

您可以在Vue组件的beforeMount部分中调用此函数 :

 ....
 methods:{
     getUnits: function() {...}
 },
 beforeMount(){
    this.getUnits()
 },
 ......

工作提琴:https : //jsfiddle.net/q83bnLrx/1/

Vue提供了不同的生命周期挂钩:

我列出的几个是:

  1. beforeCreate:在实例初始化之后,数据观察和事件/观察程序设置之前同步调用。
  2. created:创建实例后同步调用。在此阶段,实例已完成对选项的处理,这意味着已设置以下内容:数据观察,计算的属性,方法,监视/事件回调。但是,安装阶段尚未开始,并且$ el属性尚不可用。
  3. beforeMount:在挂载开始之前被调用:render函数将被首次调用。
  4. mount:在实例刚被挂载后调用,实例el被新创建的替换vm.$el
  5. beforeUpdate:在数据更改时调用,在重新渲染和修补虚拟DOM之前调用。
  6. 更新:在数据更改导致虚拟DOM重新呈现和修补后调用。

您可以在此处查看完整列表。

您可以选择最适合您的钩子,然后像上面提供的示例代码一样,通过钩子调用您的函数。


@PhillisPeters您可以放置​​更多代码,还是创建一个小提琴。
撒拉卜

@PhillisPeters请看一下更新的小提琴,我用setTimeout替换了http post调用进行仿真,现在您可以看到表中填充了数据。
Saurabh

@GeorgeAbitbol请随时更新答案。
萨拉巴

我的问题是,我不知道在Mounted()节中使用“ this”,并且遇到函数未定义的错误。上面使用了“ this”,我发现这是解决我的问题的方法,但答案中未突出显示。OP的问题与我的类似吗?添加标注以解决绑定问题可以使此答案更好吗?
mgrollins

31

您需要执行以下操作(如果要在页面加载时调用方法):

new Vue({
    // ...
    methods:{
        getUnits: function() {...}
    },
    created: function(){
        this.getUnits()
    }
});

1
试试吧created
Alpha

1
@PhillisPeters您可以使用created或beforeMount。
萨拉巴


3

当心,当 mounted组件上触发事件,尚未替换所有Vue组件,因此DOM可能不是最终的。

要真正模拟DOMonload事件,即在DOM准备好之后但在绘制页面之前触发,请从内部使用vm。$ nextTickmounted

mounted: function () {
  this.$nextTick(function () {
    // Will be executed when the DOM is ready
  })
}

0

如果您获得数组中的数据,则可以执行以下操作。对我有用

    <template>
    {{ id }}
    </template>
    <script>

    import axios from "axios";

        export default {
            name: 'HelloWorld',
            data () {
                return {
                    id: "",

                }
            },
    mounted() {
                axios({ method: "GET", "url": "https://localhost:42/api/getdata" }).then(result => {
                    console.log(result.data[0].LoginId);
                    this.id = result.data[0].LoginId;
                }, error => {
                    console.error(error);
                });
            },
</script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.