質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Q&A

解決済

2回答

1503閲覧

Nuxtでカスタムディレクティブの引数にdataのオブジェクト`elements[0].dScroll`の中身の`50`を渡したい

mogataro

総合スコア12

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

0グッド

0クリップ

投稿2019/04/22 21:20

前提・実現したいこと

v-scroll:elements[0].dScroll="activeScroll"で、
ディレクティブの引数にdataelements[0].dScrollの中身の50を渡したいのに、
elements[0]という文字列が渡ってしまう。

発生している問題・エラーメッセージ

console.log(binding.arg);で引数を確認すると、
elements[0]と表示される。

該当のソースコード

pages/Scroll.vue

vue

1<template lang="pug"> 2section.sample-scroll 3 p.centered Scroll me 4 div.box( 5 v-scroll:elements[0].dScroll="activeScroll" 6 ) 7 transition(name="text") 8 p.text(v-if="elements[0].isActive") {{elements[0].text}} 9</template> 10<script> 11export default { 12 name: "Scroll", 13 components: {}, 14 data() { 15 return { 16 isActive: false, 17 elements: [ 18 { 19 isActive: false, 20 dScroll: 50, 21 text: 22 "本居宣長は享保15年(1730年)6月伊勢国松坂(現在の三重県松阪市)の木綿仲買商である小津家[10]の次男として生まれる。" 23 } 24 ] 25 }; 26 }, 27 methods: { 28 activeScroll(evt, el, arg) { 29 if (window.scrollY > arg) { 30 this.isActive = true; 31 el.setAttribute("style", "opacity: 1;"); 32 } else { 33 this.isActive = false; 34 el.setAttribute("style", "opacity: 0;"); 35 } 36 } 37 } 38}; 39</script>

plugins/scroll.js

js

1import Vue from "vue"; 2 3Vue.directive("scroll", { 4 inserted(el, binding) { 5 console.log(binding.arg); 6 let f = function(evt) { 7 let arg = binding.arg ? binding.arg : 0; 8 if (binding.value(evt, el, arg)) { 9 window.removeEventListener("scroll", f); 10 } 11 }; 12 window.addEventListener("scroll", f); 13 } 14});

補足情報(FW/ツールのバージョンなど)

Nuxt.js バージョン2.2.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Vue.js 2.6.0以降なら動的引数が使えます。

pug

1v-scroll:[elements[0].dScroll]="activeScroll"

投稿2019/04/23 03:28

wtokuno

総合スコア448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mogataro

2019/04/23 05:34

ご回答いただきありがとうございます。 まさに求めていた方法です。 今年の2月に新バージョンが出ていたのですね! とはいえ、公式ドキュメントに記載されていたのに見つけられなかったのは不甲斐ないです。
guest

0

アンチパターンかもしれませんが、参考までに、

vue

1<template lang="pug"> 2section.sample-scroll 3 p.centered Scroll me {{ elements[0].dScroll }} 4 div.box( 5 :class="{scrollActive: isActive}" 6 v-scroll:elements[0]="activeScroll" 7 ) 8 transition(name="text") 9 p.text(v-if="elements[0].isActive") {{elements[0].text}} 10</template> 11<script> 12export default { 13 name: "Scroll", 14 components: {}, 15 data() { 16 return { 17 isActive: false, 18 elements: [ 19 { 20 isActive: false, 21 dScroll: 50, 22 text: 23 "本居宣長は享保15年(1730年)6月伊勢国松坂(現在の三重県松阪市)の木綿仲買商である小津家[10]の次男として生まれる。" 24 } 25 ] 26 } 27 }, 28 created () { 29 if (process.browser) { 30 window.addEventListener('scroll', this.scroll) 31 } 32 }, 33 destroyed() { 34 if (process.browser) { 35 window.removeEventListener('scroll', this.scroll) 36 } 37 }, 38 methods: { 39 scroll(){ 40 return window.scrollY 41 }, 42 activeScroll(evt, el, arg) { 43 const argValue = 'this.' + arg 44 const scrollValue = eval(argValue).dScroll 45 const scrollY = this.scroll() 46 if (scrollY > scrollValue) { 47 this.isActive = true 48 } else { 49 this.isActive = false 50 } 51 } 52 } 53} 54</script> 55<style lang="scss" scoped> 56.box { 57 opacity: 0; 58} 59.box.scrollActive { 60 opacity: 1; 61} 62</style>

v-scroll:elements[0].dScrollのelements[0].dScrollが文字列で受けとられてるので、evalで文字列から式に直してあげてます。

投稿2019/04/23 02:22

sauzar18

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mogataro

2019/04/23 05:32

ご回答いただきありがとうございます。 勉強になりました。 javascriptのグローバル関数にも詳しくならないといけませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問