在JavaScript函数中使用AlpineJS(3)魔法属性

7cwmlq89  于 12个月前  发布在  Java
关注(0)|答案(2)|浏览(95)

我正在使用一个modal的store,并喜欢使用神奇的$watch方法,如下所示:

Alpine.store('modal', {
    init() {
        this.$watch('this.open', (val) => console.log(val))
        // Here I like to do if(open) { document.body.classList.add('overflow-hidden') } 
    },
    open: false,
    id: null,
    close() {
        this.open = false
        this.id = null
    }
})

字符串
但我得到TypeError: this.$watch is not a function

doinxwow

doinxwow1#

将第二个参数 Package 在箭头函数中:

Alpine.store('modal', () => ({
    init() {
        this.$watch('this.open', (val) => console.log(val))
    },
    open: false,
    id: null,
    close() {
        this.open = false
        this.id = null
    }
}))

字符串
箭头函数捕获封闭上下文的this值,从而使您可以访问Alpine的神奇方法。

lbsnaicq

lbsnaicq2#

您不能在Alpine.store中使用$watch,但仍有两个选项可用
1.使用Store的数据作为html元素的x-data,并在html本身中使用$watch来监视该数据。因此,在这里mystore's data将是x-data本身,因此监视它最终将监视该store的isStoreOpen属性。

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
<script>
 Alpine.store('mystore',{
    init() {
      console.log('hi there in store')

    },
    isStoreOpen: true,
    toggle() {
        
          this.isStoreOpen = !this.isStoreOpen;
    }
 })
</script>

<div x-data="$store.mystore" x-init="$watch('isStoreOpen', (val) => console.log(val))">
  <p>
    What you can toggle
  </p>
  <button @click="toggle()" x-text="$store.mystore.isStoreOpen">
    
  </button>
</div>

字符串
1.或者出于某种原因,如果你需要在store的方法本身中使用魔法,或者有不同的x-data,那么你必须使用参数传递魔法。这里我在init数据方法中使用startStoreWatch方法,而不是init store方法,因为store的init方法用于初始化该store。
这样,存储将监视它自己的属性,就像数据监视它自己的属性一样。

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
<script>
 Alpine.store('mystore',{
    init() {
      console.log('hi there in store')
            
    },
    count: 0,
    startStoreWatch($watch, $store) {
     $watch('$store.mystore.count', (val) => console.log(val))
    },
    toggle() {
       this.count++;
    }
 })
</script>

<div x-data="{
      init() {
         // here we are watching isOpen of data and count of store
         this.$store.mystore.startStoreWatch(this.$watch, this.$store)
         this.$watch('isOpen', (val) => console.log(val))
      },
      isOpen: false,
      toggle() {
        this.isOpen = !this.isOpen;
      }
}">
  <p x-show="isOpen">
    What you can toggle
  </p>
  <button @click="() => {
    toggle()
    $store.mystore.toggle()
  }" x-text="`store is toggled ${$store.mystore.count} times`">
    
  </button>
</div>

相关问题