LoginSignup
6
1

More than 3 years have passed since last update.

riotタグにjsonで連想配列を渡してやるとvalueが消える件

Last updated at Posted at 2018-07-28

背景

riotのカスタムタグに連想配列をjsonで渡そうとした時に起きた現象。
ドツボに嵌ったので共有

環境

  • MacOs High Sierra
  • php 7.1.14
  • laravel5.5.40(今回多分関係ない)
  • riotjs3.10.3

どういった現象か

$array = ['name' => 'John', 'age' => 24];

この配列を

member.html
<member status='<?= json_encode($array) ?>'></member>   //riotタグ

といった風にjsonに変換してriotタグに渡してやる

member.tag
<member>
  <script>
    console.log(this.opts.status)
  </script>
</member>

console.logでパラメータを確認すると

name age

と出力される

どこにいったvalue?

連想配列のキーだけになっている。なんで?
こんな感じになってほしいのだが・・・

{name: "John", age: 24}
age:24
name:"John"

 原因

公式に答えがありました。

クラス省略記法
RiotはCSSクラス名について特別な文法をもっています。例えば、

<p class={ foo: true, bar: 0, baz: new Date(), zorro: 'a value' }></p>

は、”foo baz zorro”として評価されます。

クラス省略記法として解釈されていたんですね。(なんでかはソース読めばいいんでしょうが、別の機会に)

回避方法

json_encodeされたものを、さらに中括弧でくくってやると、クラス省略記法としては解釈されないみたいです。

member.html
<member status='<?= "{" . json_encode($array) . "}" ?>'></member>   //riotタグ

流石に不恰好なので、こんな感じのヘルパー関数を作成して、

if (!function_exists('json_encode_for_riot')) {

    /**
     * @param $mixed mixed 配列もしくはCollection
     * @return string
     */
    function json_encode_for_riot($mixed): string
    {
        return '{' . json_encode($mixed) . '}';
    }
}

使えば、まあ、良いかも

member.html

<member status='{{ json_encode_for_riot($array) }}'></member>   //riotタグ

他にエレガントな回避方法ないんですかね・・・。

参考(というか答え)

最初はよくわからなかったのですが、最終的にはおそらく同じ現象だと理解できました。
ありがとうございます。

RiotのカスタムタグにJSONを渡す

6
1
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1