Closed13

DOM指定マウント方式なコンポーネントを作りたい

ピン留めされたアイテム
miyanokomiyamiyanokomiya

svelteでcustom elementにしないというのが一番求めているものに近いかもしれない。
この場合はsvelteコンポーネントの挙動通りでpropsをnew時点で渡せる。

new App({ target, props })

コンポーネントを単体でlibビルドするだけでいい、これが答えっぽい。

  build: {
    lib: {
      entry: path.resolve(__dirname, 'src/Target.svelte'),
      name: 'target-element',
    }
  }
miyanokomiyamiyanokomiya

こういうやつ。

import { Player } from 'blendic-svg-player'

const player = new Player('target_id', {
  width: '100%',
  height: '100%',
})

web componentが登場しているものの、昔ながらのこの方式の使い勝手が捨てがたい。
しかしこの方式を実現するのに適したツールがない(多分)。つまりオプションの渡し方やレンダリングの更新やらは自作しないといけなくなって面倒が多い。

miyanokomiyamiyanokomiya

custom elementになっているとattributeとして文字列を渡すことしかできない。
入り組んだデータを渡したい場合はJSON.stringifyが必要だったりと微妙。

miyanokomiyamiyanokomiya

似た使用感になる気もするけどscript側で触る前提のcustom elementに存在意義があるのか問題。
それならやはり最初からdom指定マウント方式になっていた方が分かりやすい。
script制御なしで宣言的にも設置できるよう両対応しておけるならありか。

miyanokomiyamiyanokomiya

こういう使い方もできはする。この方向がいいかもしれない。

const myComponent = document.createElement('my-component')
myComponent.foo = [1, 2, 3]
document.body.append(myComponent )
miyanokomiyamiyanokomiya

ImageなんかもnewしてからsrcなどしていくからHTMLElementというのはそういうものなのかもしれない。
new時に必須なpropsはない。ただしappendなりされてレンダリングされるときには必須扱いとなるpropsがある。そのライフサイクルイベントで必須チェックを行えばいい(できるのか?)。

miyanokomiyamiyanokomiya

↑のissueよく見たらロングランしていて結局戻されたような気配ある。まだ揉めているのかもしれない。

実際に試してみてもやはりonMount時点でpropsは渡っていない。

miyanokomiyamiyanokomiya

親側でonMountよりも前のタイミングでnewするとなぜかpropsを渡せる。
$: {}記法でマウント先のelementをtargetにすればそうなる。

このあたり怪しさ満載でまだ実用的ではない可能性高い。

miyanokomiyamiyanokomiya

どちらにせよやはりnewと同時にpropsを渡すことはできない。
custom elementとはそういうもの。

このスクラップは2021/06/03にクローズされました