首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Alpine.js中基于父元素类的x-显示元素

在Alpine.js中基于父元素类的x-显示元素
EN

Stack Overflow用户
提问于 2022-01-13 13:11:35
回答 1查看 1K关注 0票数 0

在我的WooCommerce主题中,当WooCommerce使用AJAX动态地向元素添加“加载”类时,我希望显示旋转图标。

我尝试使用Alpan.js的$el属性来检索当前的DOM节点,但这是行不通的。它也不是在“看”classList的。

如何使用Alpine.js完成这一任务?

代码语言:javascript
复制
<button type="submit" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" class="ajax_add_to_cart add_to_cart_button single_add_to_cart_button button alt flex justify-center" data-product_id="<?php echo get_the_ID(); ?>">

    <!-- Spinner Icon -->
    <svg x-show="$el.parentElement.classList.contains('loading')" class="animate-spin py-1 h-7 w-7 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
        ...
    </svg>

    <!-- Toevoegen aan winkelmand -->
    <span x-show="$el.parentElement.classList.contains('!loading')">
        <?php echo esc_html( $product->single_add_to_cart_text() ); ?>
    </span>
    
</button>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-15 13:07:42

深入了解WooCommerce源代码,发现它使用了jQuery事件系统,因此我们必须在jQuery和Alpine.js之间创建一个小事件总线。这两个事件分别是在AJAX调用之前调用的adding_to_cart事件和在成功的AJAX调用之后触发的added_to_cart事件(即产品已经添加到购物车中)。

让我们调用事件总线catchWooEvents

代码语言:javascript
复制
<script>
document.addEventListener('alpine:init', () => {
    Alpine.data('catchWooEvents', () => ({
        loading: false,

        init() {
            $(document.body).on('adding_to_cart', (event, button, data) => {
                this.loading = true
            })
            $(document.body).on('added_to_cart', (fragments, cart_hash, button) => {
                this.loading = false
            })
        }
    }))
})
</script>

我们有一个新的变量loading,它在两个事件之间是活动的。您可以看到,我们在$.on()中使用了jQuery的init()函数来捕获jQuery事件,但随后我们操作了一个Alpine.js变量。

修改后的按钮示例:

代码语言:javascript
复制
<div x-data="catchWooEvents">
    <button type="submit" name="add-to-cart" value="<?php echo esc_attr( $product->get_id() ); ?>" class="ajax_add_to_cart add_to_cart_button single_add_to_cart_button button alt flex justify-center" data-product_id="<?php echo get_the_ID(); ?>">

        <!-- Spinner Icon -->
        <svg x-show="loading" class="animate-spin py-1 h-7 w-7 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
            ...
        </svg>

        <!-- Toevoegen aan winkelmand -->
        <span x-show="!loading">
            <?php echo esc_html( $product->single_add_to_cart_text() ); ?>
        </span>
        
    </button>
</div>

我们有一个新的父div元素,其中应用了catchWooEvents组件,因此多个子按钮可以共享加载状态。在x-show属性中,loading变量现在是反应性的。

注意:catchWooEvents的定义必须放在jQuery脚本行之后。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70697193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档