Vue.js 在渲染组件上调用函数

Posted

技术标签:

【中文标题】Vue.js 在渲染组件上调用函数【英文标题】:Vue.js Calling function on a rendered component 【发布时间】:2016-08-17 00:20:40 【问题描述】:

我想使用 Laravel 和 Vue.js 创建一个交互式 scrumboard,其中包含多个列,并且在这些列中包含多个票。

这些票证是具有一些不错的编辑/删除/(取消)分配开发人员功能的 vue 组件,并且也用于其他页面。

我有多个这样定义的列:

        <div id="scrumboard">
            <div class="scrumboard__column">
                <div class="scrumboard__title">Open</div>
                <div class="scrumboard__tickets_wrapper" data-status="open">
                    @if( $sprint->hasTicketsOfStatus("open") )
                        @foreach( $sprint->getTicketsByStatus("open") as $ticket )
                            <ticket :data=" $ticket->getJsonData(true) "></ticket>
                        @endforeach
                    @endif
                </div>
            </div>
            <div class="scrumboard__column">
                <div class="scrumboard__title">In progress</div>
                <div class="scrumboard__tickets_wrapper" data-status="progress">
                    @if( $sprint->hasTicketsOfStatus("progress") )
                        @foreach( $sprint->getTicketsByStatus("progress") as $ticket )
                            <ticket :data=" $ticket->getJsonData(true) "></ticket>
                        @endforeach
                    @endif
                </div>
            </div>
            <div class="scrumboard__column">
                <div class="scrumboard__title">Finished</div>
                <div class="scrumboard__tickets_wrapper" data-status="closed">
                    @if( $sprint->hasTicketsOfStatus("closed") )
                        @foreach( $sprint->getTicketsByStatus("closed") as $ticket )
                            <ticket :data=" $ticket->getJsonData(true) "></ticket>
                        @endforeach
                    @endif
                </div>
            </div>
        </div>

如您所见,它会为每列找到的每个工单呈现一个工单组件。

不,我已将 scrumboard__tickets_wrapper div 转换为 jquery ui 可排序列表,允许您在列之间交换票。

<script>
    $(document).ready(function()

        $(".scrumboard__tickets_wrapper").sortable(
            connectWith: '.scrumboard__tickets_wrapper',
            receive: function(event, ui)
                console.log("Switched columns");
                console.log(event);
                console.log(ui);
                var target = $(event.target);
                target.css("background-color", "#ff0000");
            
        );
</script>

到目前为止一切正常,现在我的问题是:一旦将票放入另一个列表,如何动态调用票证组件上的“updateStatus()”函数?

如您所见,我可以获取要删除的特定元素以及已将其放入的可排序列表。所以我通过抓取包装器的 data-status 属性知道新状态是什么 + 我知道哪个元素被删除了。

但是如何获取有问题的票证组件的实例并调用 updateStatus 函数来保存新状态?

提前致谢!

Screenshot of the scrumboard

【问题讨论】:

使用的主要技术是使用this.$el 从组件内应用.sortable。然后,您可以在 .sortable 调用外部使用 var self = this; 并在调用内部使用 self 捕获对组件的引用。从那里,您可以使用 ui 中的信息来确定要调用哪个组件的 updateStatus() 以及如何正确地重新排列内部数组以匹配 DOM。 【参考方案1】:

感谢 David 为我指明了正确的方向。我的问题的解决方案是正确的组件嵌套。

解决方案是创建 3 个具有适当子组件继承的组件。并在其父模板中声明子组件。

这样我最终只声明了“”,神奇的事情发生了:D。

所以我制作了 3 个组件: - scrumboard > 将 scrumboardColumn 作为组件 - scrumboardColumn > 以票据为组件 - 门票

vue 根实例也会加载工单组件,因为工单组件也用于积压页面。

我还没有完全完成最终产品,但我通过像 David 建议的那样从 scrumboardColumn 组件的 ready 函数中调用它来完成可排序工作。

希望这对未来的人有所帮助!

【讨论】:

以上是关于Vue.js 在渲染组件上调用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在vue.js渲染完界面之后再调用函数

Vue.js:如何在组件初始化时触发观察器函数

Vue.js 警告您可能在组件渲染函数中有无限更新循环

从子组件调用父函数会在 Vue.js 中引发错误

Laravel 6 + Vue.js 无法挂载组件:未定义模板或渲染函数

JEST 不会触发模拟函数 Vue js