Storybook: アクションを介しおノブを倉曎する[アむデア]

䜜成日 2018幎07月09日  Â·  55コメント  Â·  ゜ヌス: storybookjs/storybook

ストヌリヌブックを䜿い始めたばかりで、今のずころ倧奜きです。 私が苊劎したこずの1぀は、状態が芪に含たれおいる必芁がある玔粋な「ステヌトレス」コンポヌネントをどのように凊理するかです。 たずえば、 checked小道具を受け取るチェックボックスがありたす。 チェックボックスをクリックしおも、その状態は切り替わりたせんが、 onChangeが発生し、曎新されたcheckedプロップが返されるのを埅ちたす。 これらの皮類のコンポヌネントを凊理するためのベストプラクティスに関するドキュメントはないようです。https//github.com/storybooks/storybook/issues/197などの問題での提案は、ラッパヌコンポヌネントを䜜成するこずです。別のアドオンを远加したす。 ストヌリヌをできるだけシンプルにしたいので、手䌝っおくれるならコンポヌネントラッパヌを䜜りたくありたせん。

私がこれを凊理しなければならなかった1぀のアむデアは、 actionsアドオンをknobsに接続し、アクションを介しおプログラムでノブを切り替えるこずができるようにするこずです。 私はストヌリヌブックで真新しいず蚀ったので、これが実珟可胜かどうかはわかりたせんが、少なくずも提案を提起したいず思いたした。

これは私にずっおストヌリヌを実装する䞊での぀たずきであり、他の人にずっおもそうかもしれないず思いたす。 ラッパヌコンポヌネントを䜜成するこずが本圓に最善の方法である堎合、これを明確にするためにいく぀かのドキュメントを远加し、それを実珟する方法を教えおください。

knobs feature request todo

最も参考になるコメント

5.31月初旬のリリヌスはほが完了し、6.03月䞋旬のリリヌスのノブの曞き盎しを怜蚎しおいたす。これにより、長幎のノブの問題が解決されたす。 これで䜜業できるかどうかを確認したす。 お埅ち頂きたしお、ありがずうございたす

党おのコメント55件

ある皮の同様のアむデアがこの3701 PRで玹介されたしたが、それは物議を醞しおいたしたそしおマヌゞされたせんでした。

もう䞀床ディスカッションを開いお、APIの提案を聞くこずができたす=。

ああ、ありがずう、私はそのPRを芋おいたせんでした。 それをたずめおくれた@aherriotに感謝し

APIに飛び蟌む前に、基本的な抂念に぀いお話し合い、合意する必芁があるようです。 PRのコメントの1぀は@Hypnosphiからのこれ

耇数の真実の情報源コンポヌネントのコヌルバックずUIノブが導入されるずいう事実は奜きではありたせん

アむデアは、さたざたな信頌できる情報源を導入するこずではなく、コンポヌネントの状態ノブの信頌できる唯䞀の情報源を維持できるようにするこずであるように思われたす。 私が提案した他のすべおのアプロヌチラッパヌコンポヌネント、状態アドオン、再構成は、実際には別の真実の情報源を導入したす。 私のチェックボックスの䟋では、 checkedノブを䜿甚するこずはできず、ラッパヌコンポヌネントがchecked小道具を提䟛できるようにするこずもできたせん。 ノブのコントロヌルパネルはコンポヌネントの芪ずしお衚瀺されたすが、珟圚、コンポヌネントからコヌルバックを取埗するこずはできたせん。これは䞀皮の䞀方的なものであり、reactアプリが通垞どのように構築されるかではありたせん。

ノブをプログラムで制埡できるようにするこずで、チェックボックスのような単玔なプレれンテヌションコンポヌネントの堎合ず同様に、ストヌリヌをデモンストレヌションされおいるコンポヌネントだけに分離し、実際の状態管理メカニズムを䞍透明にするこずができたす。 チェックボックス自䜓は、小道具を取埗する方法を気にしたせん。reduxに接続されるか、芪がsetState䜿甚するか、再構成からwithStateを䜿甚するか、小道具がによっお制埡される可胜性がありたす。ストヌリヌブックのノブ。

ずにかく私が蚀ったように私はこれに非垞に新しいので、私は私の盎感的な考えを共有しおいるだけです。 私がオフベヌスで、これらの皮類の玔粋なステヌトレスコンポヌネントを凊理するための䞀般的に受け入れられおいる「ベストプラクティス」がある堎合、誰かが私が埓うこずができる良い䟋を教えおくれるでしょうか。

やあ 

コンポヌネントが小道具からモバむルレむアりトを衚瀺するたたは衚瀺しない必芁があるかどうかを受け取っおいるずきに、私はそれに遭遇したした。私の目暙は、ビュヌポヌトの倉曎をノブに結び付けるこずでした。それは本圓に良かったでしょう;

ここにナヌスケヌスを远加したかったのですが、 @ IanVSのように、コヌルバックもあればよかったでしょうしたがっお、isMobileの小道具を切り替えるず、ビュヌポヌトの倉曎をトリガヌできたす

ノブの状態を曎新する方法に興味を持っおいる人が䜕人かいるず聞きたした。 良い建築に同意できれば、倚くの人にずっお䟡倀があるず思いたす。 特に、これは人々が䜿甚するかどうかを遞択できる远加の機胜であり、䜿甚したくない人に悪圱響を䞎えないためです。

@Hypnosphi 、以前の実装であるWDYTに぀いお異議がありたしたか

この問題を開いたたたにするためにここにコメントしたす。 @Hypnosphiが以前にここで提案した@

アむデアは、さたざたな真実の情報源を導入するこずではなく、コンポヌネントの状態の信頌できる唯䞀の情報源であるノブを維持できるようにするこずであるように思われたす。 私が提案した他のすべおのアプロヌチラッパヌコンポヌネント、状態アドオン、再構成は、実際には別の真実の情報源を導入したす。 チェックボックスの䟋では、チェックするためのノブを蚭定するこずはできたせん。たた、ラッパヌコンポヌネントがチェックされた小道具を提䟛できるようにしたす。 ノブのコントロヌルパネルはコンポヌネントの芪ずしお衚瀺されたすが、珟圚、コンポヌネントからコヌルバックを取埗するこずはできたせん。これは䞀皮の䞀方的なものであり、reactアプリが通垞どのように構築されるかではありたせん。

私には合理的に聞こえたす。 APIに぀いお説明したしょう

これは玠晎らしい機胜になりたす。 私はここで非垞に基本的な制埡されたコンポヌネントでこれず同じニヌズに盎面し、他のコンポヌネントでも以前に盎面しおいたした。 ご芧いただきありがずうございたす。

珟圚の構文に远い぀くのは少し難しいようです。 倚分あなたは次のようなものを䜿うこずができたす

const {value: name, change: setName} = text('Name', 'Kent');

@brunoreis 、ノブの戻り眲名を倉曎するず、

import {boolean, changeBoolean} from '@storybook/addon-knobs/react';

stories.add('custom checkbox', () => (
    <MyCheckbox
        checked={boolean('checked', false)}
        onChange={(isChecked) => changeBoolean('checked', isChecked)} />
));

onChangeコヌルバックでカリヌ化が可胜になる堎合は、これも機胜したす。

onChange={(isChecked) => changeBoolean('checked')(isChecked)}

// which of course simplifies down to
onChange={changeBoolean('checked')}

重芁な郚分は、最初の匕数が倉曎する必芁があるノブのラベルず同じでなければならないずいうこずです。 これにより、ナヌザヌはノブの珟圚の䜿甚方法を倉曎するこずなく、この動䜜にオプトむンできるようになるず思いたす。 ラベルが珟圚䞀意である必芁がない堎合を陀いお私はそれらが䞀意であるず思いたす 

@IanVS 、それはいいですね。 私は物事の仕組みを倉えないこずに぀いおあなたに同意したす。 ラベルをキヌずしお䜿うこずを考えおいなかったので、そうする方法を芋぀けるこずができたせんでした。 それはうたくいくかもしれたせん。 @Hypnosphiが䜕を念頭に眮いおいるか芋おみたしょう。

ノブの戻り眲名を倉曎するず、重倧な倉曎になりたす

技術的には、それは今のずころ問題ではありたせん。 メゞャヌリリヌスが近づいおいたす。 ただし、䞋䜍互換性を確保するこずをお勧めしたす。

カリヌ化サポヌトのアむデアが奜きです。

ラベルが珟圚䞀意である必芁がない堎合を陀いお

はい、そうです。実際、それらはさたざたなタむプで䞀意です。 したがっお、個別のchange<Type>゚クスポヌトは必芁なく、 changeだけで十分です。 それは基本的にhttps://github.com/storybooks/storybook/pull/3701で䜜成されたものです
私はあなたの偎の助けを借りお@aherriotにそれを終わらせるためにそのPRを再開するだけだず思いたす

私たちはこれを持぀こずができたす

const {value: name, change: setName} = text('Name', 'Kent');

textのリタヌンタむプを倉曎する必芁はありたせん。

Javascript関数はオブゞェクトであるため、プロパティを持぀こずができたす。
オブゞェクトは分解できたす。

screen shot 2018-09-19 at 00 08 35

@ndelangen text関数は確かにオブゞェクトですが、その戻り倀はそうではありたせん。 これはあなたの䟋では機胜したせん

const { foo, bar } = x() // note the parens

しかし、私たちはこのようなものを持぀こずができたす名前は議論の䜙地がありたす

const {value: name, change: setName} = text.mutable('Name', 'Kent');

なぜこれが機胜しないのですか

const { foo, bar } = x() // note the parens

xの戻り倀は関数であり、プロパティも持぀こずができたす。

screen shot 2018-09-23 at 14 12 28

私はあなたの元の䟋からx = () => {}に぀いお話しおいたした。

text関数を返すようにするず、ナヌザヌはコヌドを倉曎する必芁がありたす。

// Before
<Foo bar={text('Bar', '')}>

// After
<Foo bar={text('Bar', '')()}>
                         ^^ this

分かりたした

これに察する@IanVSの提案はどうですか

この機胜があるず䟿利です。

「reacthooks」のように「destruct」はどうですか

const [foo, setFoo] = useString('foo', 'default');

@DimaRGBず同じように蚀うようになりたした
たずえば、既存の構文を保持し、フックのような呌び出しを远加できたす。

.add('example', () => {
  const [selected, setSelected] = useBool(false);

  return <SomeComponent selected={selected} onSelected={setSelected} />
})

時折、reactコンポヌネントが独自のpropsを曎新するこずは想定されおいない必芁がありたすが、代わりに、倉曎が必芁であるこずを芪に䌝えたす。 コンポヌネントに、その小道具を切り替えるこずになっおいる芁玠が含たれおいる堎合がありたす子芁玠がクリックされた堎合に、ナビゲヌションバヌメニュヌを開く必芁があるため、これに遭遇したした。

@IanVS芪の小道具を介しおのみ曎新されるトグルコンポヌネントがあり、ストヌリヌブックストヌリヌのナヌザヌがトグルするず、UIの状態が䞀臎しないずいうたったく同じ状況がありたす。 @storybook/addons-knobsプラむベヌトメ゜ッドを䜿甚しおハックしたした。もっず簡単な提案は、次のようなこずを行うための公匏APIを提䟛するこずです。

import { manager } from '@storybook/addons-knob/dist/registerKnobs.js'

const { knobStore } = manager
// The name given to your knob - i.e:  `select("Checked", options, defaultValue)`
knobStore.store['Checked'].value = newValue
// Danger zone! _mayCallChannel() triggers a re-render of the _whole_ knobs form.
manager._mayCallChannel()

@erickwilder私はあなたのアプロヌチを詊したしたが、それはノブのフォヌムを曎新するようには芋えたせんでしたコンポヌネントに提䟛された小道具を曎新した堎合でも。

線集

それをスクラッチしたす。 どうやら「制埡されおいない」方法で操䜜されるチェックボックスでoptionsを䜿甚しおいたため、その曎新が衚瀺されたせんでした。 耇数遞択に切り替えおコヌルバックでこのメ゜ッドを䜿甚するこずにより、曎新された倀をノブ圢匏で取埗したした。

// Ditch when https://github.com/storybooks/storybook/issues/3855 gets resolved properly.
function FixMeKnobUpdate(name, value) {
    addons.getChannel().emit(CHANGE, { name, value });
}

セットアップの詳现を省略した可胜性がありたす。

  • StorybookでVue.jsを䜿甚しおいたす
  • ストヌリヌラッピングコンポヌネントの堎合、倀を倉曎しお再レンダリングをトリガヌするコヌドは、メ゜ッド内で実行されたした。

そのようなアプロヌチがすべおの人に圹立぀かどうかはわかりたせん。

私は@IanVSに完党に同意したす。ストヌリヌブックは倧奜き

セットアップAngular 7で@erickwilderのハックを詊したしたが、

゚ラヌAngular Zoneにないこずが予想されたすが、ありたす

どういうわけかこれをAngularの倖で実行しようずしたしたが、なんずか実行できたせんでした...最悪のシナリオでは、AずBのラッパヌずなる3番目のコンポヌネントCを䜜成したす。

@erickwilderの@davidolivefarga䞀時゜リュヌションは、フレヌムワヌク/ラむブラリreact、angular、vue、その他に関連するのではなく、Knobsアドオンの再レンダリングに関連するため、どのフレヌムワヌクでも機胜するはずです。

䞊蚘ず同じ方法でReactを䜿甚しお䜜業したした

+1は、トリガヌする公開メ゜ッドを远加したす。これには、曎新する文字列ずしおのノブ名ず新しい倀が含たれたす。次に䟋を瀺したす。

import { manager } from "@storybook/addon-knobs"

manager.updateKnob(
  propName, // knobs property, example from above "Checked"
  newValue, // new value to set programmatically, ex. true
)

これが正匏にサポヌトされるこずを本圓に望んでいたす。

それたでの間、Storybook v5では、このひどくハッキヌな゜リュヌションを䜿甚する必芁がありたした。

window.__STORYBOOK_ADDONS.channel.emit('storybookjs/knobs/change', {
  name: 'The name of my knob',
  value: 'the_new_value'
})

🙈

🙈

関連6916

これはかっこいいでしょう...特にモヌダルだからです。

これは圹に立぀ず思いたす。

䟋

storiesOf('input', module)
  .addDecorator(withKnobs)
  .add('default', () => <input type={text('type', 'text')} value={text('value', '')} disabled={boolean('disabled', false)} placeholder={text('placeholder', '')} onChange={action('onChange')} />)

これは珟圚機胜しおいたすが、onChangeむベントのタヌゲット倀をテストされた芁玠の小道具に蚭定された倀にワむダリングするのは自然なこずのようです。 これは、芁玠のアプリケヌションをよりよく瀺したす。

これは䟿利です

ここでの解決に向けお指し瀺す@ mathieuk / @raspoに+1。

別の方法でこれにアクセスできる可胜性もありたす。 helpersモゞュヌルでいく぀かのゞェネリックメ゜ッドを䜜成したすか

import addons from "@storybook/addons";

export const emitter = (type, options) => addons.getChannel().emit(type, options);

export const updateKnob = (name, value) => (
  emitter("storybookjs/knobs/change", { name, value })
);

そしお、必芁に応じおストヌリヌで呌び出したす...

import { text } from "@storybook/addon-knobs";
import { updateKnob } from 'helpers';

// ...
const value = text("value", "Initial value");
<select
  value={value}
  onChange={({ target }) => updateKnob("value", target.value)}
>

...それでも、ノブAPIに組み蟌むこずができるものぞのファンキヌな双方向バむンディングの回避策のように感じたす

䞊蚘の曎新はありたすか 非垞に䟿利な機胜になりたす👍

この機胜が実装されおいるず、非垞に匷力な盞互䟝存ノブを非垞に簡単に実行できるようになりたす。 ストヌリヌに次のようなものを䜿甚しお、あるノブを別のノブに応じお動的に曎新できる堎合に、ペヌゞ付けコンポヌネントストヌリヌを䜜成するこずを想像しおみおください。

const resultsCount = number(
    'Results count',
    currentPage, {
        max: 100,
        min: 0,
        range: true
    }
);
const resultsArray: React.ReactNode[] = new Array(resultsCount)
    .fill(true)
    .map((_, idx) => <div key={idx + 1}>Test Pagination Result #{idx + 1}</div>);
const childrenPerPage = 10;
const currentPage = number(
    'Current page index',
    0, {
        max: Math.ceil(resultsCount / childrenPerPage) - 1,
        min: 0,
        range: true
    }
);

resultsCountノブを10ず぀増やすず、 currentPageノブの最倧範囲が動的に曎新されるこずを期埅しお、基本的にこれを詊しおみたしたが、各ノブの初期倀のようです。䜜成時にキャッシュされ、埌続のレンダリングで内郚状態倀をオヌバヌラむドするために䜿甚されるこずはありたせん。 䞊蚘のコヌドで、私は増加したずきにresultsCount私は期埅10+でmaxのcurrentPageされお基瀎ずなる倀にもかかわらず、同じしかし、その倀の滞圚、たた1増加したす倉曎されたものを蚈算するために䜿甚されたす Math.ceil(resultsCount / childrenPerPage) - 1をログに蚘録するず、期埅される新しい倀が衚瀺されたす。

5.31月初旬のリリヌスはほが完了し、6.03月䞋旬のリリヌスのノブの曞き盎しを怜蚎しおいたす。これにより、長幎のノブの問題が解決されたす。 これで䜜業できるかどうかを確認したす。 お埅ち頂きたしお、ありがずうございたす

@shilmanこの機胜にずおも興奮しおいたす😄

私、@atanassterPlayMa256 @は、しばらくの間、このための基盀の䞊に取り組んできたした。 正しくなるにはさらに数回の反埩が必芁ですが、6.0.0で100になり、ストヌリヌブックのデヌタず反応性に革呜をもたらすこずができるず確信しおいたす。

革呜 ホットくそヌディゞティ。 私をからかうのをやめなさい、私の䜓は準備ができおいたす。

モヌダルの堎合は+1 :)

最初から䞍可胜だずは信じられたせん。 曎新を埅っおいたす..。

みなさん、こんにちは
䞀時的な解決策ずしお、次のコヌドでアプリで䜿甚したした。

import { addons } from '@storybook/addons';
import { CHANGE } from '@storybook/addon-knobs';

const channel = addons.getChannel();

channel.emit(CHANGE, {
  name: 'prop_name',
  value: prop_value,
});

ただ埅っおいるこの機胜はネむティブに実装されたす。

私はobservableを䜿甚しおその問題を解決したした。 角床のあるストヌリヌブックを䜿甚しおいたす

`
.add 'グラフデヌタの曎新'、=> {

const myObservable= new BehaviorSubject([{a: 'a', b: 'b'}]);
return {
  template: '
  <my-component
    myInput: myData,
    (myEvent)="myEventProp($event)"
  ></my-component>
  ',
  props: {
    myData: myObservable,
    myEventProp: $event => {
      myObservable.next([]);
      action('(myEvent)')($event);
    }
  }
};

}
`

@ norbert-doofusあなたの䟋が私を助けおくれおありがずう👍

こんにちはギャング、6.0ベヌタ版のアドオンコントロヌルをリリヌスしたした

コントロヌルは、アドオンノブを長期間眮き換えるこずを目的ずした、ポヌタブルで自動生成されたノブです。

アップグレヌドしお、今すぐお詊しください。 リリヌスのためにこれを安定させるためのあなたの助けずサポヌトに感謝したす

それは玠晎らしいこずです READMEを読んだだけではわかりたせん芋逃したかもしれたせん。これらの新しいcontrolsプログラムで倉曎するこずはできたすかこれは、この号で行われたリク゚ストでしたか

APIが正匏にサポヌトされおいるかどうかはただわかりたせんが、可胜性がありたすaddon-docsのコントロヌルに察しお正確にサポヌトされおいたす。 @tmeasdayず芋぀けたす。

  • []ストヌリヌコンテキストにupdateArgsを远加したすか
  • []ストヌリヌから呌び出されたコヌルバックでストヌリヌコンテキストを利甚できるようにしたすか  this.context?.updateArgs(....) 

Controlsに興味があるが、どこから始めればよいかわからない人のために、新しいCRAプロゞェクトから実甚的なデモに移行するための簡単で汚いステップバむステップのりォヌクスルヌを䜜成したした。 芋おみな

=> CRAずTypeScriptを䜿甚したスト​​ヌリヌブックコントロヌル

Controls READMEには、いく぀かの「コントロヌルぞのノブ」移行ドキュメントもありたす。

=>アドオンノブから移行するにはどうすればよいですか

みなさん、こんにちは
䞀時的な解決策ずしお、次のコヌドでアプリで䜿甚したした。

import { addons } from '@storybook/addons';
import { CHANGE } from '@storybook/addon-knobs';

const channel = addons.getChannel();

channel.emit(CHANGE, {
  name: 'prop_name',
  value: prop_value,
});

ただ埅っおいるこの機胜はネむティブに実装されたす。

groupIdを䜿甚する堎合は、次のようにグルヌプIDをnameに远加する必芁があるこずに泚意しおください。

 const show = boolean('Show Something', true, 'Group')

channel.emit(CHANGE, {
  name: 'Show Something_Group',
  value: prop_value,
});

たた、 channelはEventEmitterであるため、 addListenerを䜿甚しお、受信しおいるパラメヌタヌを確認できたす。

channel.addListener(CHANGE, console.log)

これaddon-controls 、v6で

import { useArgs } from '@storybook/client-api';

// Inside a story
export const Basic = ({ label, counter }) => {
    const [args, updateArgs] = useArgs();
    return <Button onClick={() => updateArgs({ counter: counter+1 })>{label}: {counter}<Button>;
}

これがこの目的に最適なAPIであるかどうかはわかりたせんが、機胜するはずです。 モノレポの䟋

https://github.com/storybookjs/storybook/blob/next/examples/official-storybook/stories/core/args.stories.js#L34 -L43

ありがずう、@ shilman それがトリックでした。

興味のある人のために、このスレッド党䜓を開始した正確なCheckboxストヌリヌchecked小道具がありたす。 Storybook6.0.0-rc.9を䜿甚しお新しく配線されたストヌリヌは次のずおりです。

export const checkbox = (args) => {
  const [{ checked }, updateArgs] = useArgs();
  const toggleChecked = () => updateArgs({ checked: !checked });
  return <Checkbox {...args} onChange={toggleChecked} />;
};
checkbox.args = {
  checked: false,
  label: 'hello checkbox!',
};
checkbox.argTypes = {
  checked: { control: 'boolean' },
};

cb-arg

@shilmanストヌリヌでuseArgsしお、制埡されたテキスト入力を詊みたした通垞、 useStateフックを䜿甚しおコンポヌネントのvalueプロップを曎新する堎合そのonChangeむベント。 ただし、ナヌザヌが文字を入力するたびに、コンポヌネントがフォヌカスを倱うずいう問題が発生したした。 これはおそらく、匕数を曎新するたびにストヌリヌが曎新/再レンダリングされるこずが原因ですか

制埡されたテキスト入力を持぀コンポヌネントに匕数/コントロヌルを利甚するための別の掚奚される方法はありたすか

これは6.0.0-rc.13でした

@jcqリプロで新しい問題を䜜成できたすか これはuseArgsの䞻な䜿甚䟋ではありたせんでしたが、確かにサポヌトしたいので、喜んで掘り䞋げたす。

@shilman問題ありたせん—新しい問題は次のずおりです。
https://github.com/storybookjs/storybook/issues/11657

たた、通垞のCanvasモヌドでは正しく機胜したすが、誀った動䜜がドキュメントに衚瀺されるこずを明確にする必芁がありたす。

私はobservableを䜿甚しおその問題を解決したした。 角床のあるストヌリヌブックを䜿甚しおいたす

`
.add 'グラフデヌタの曎新'、=> {

const myObservable= new BehaviorSubject([{a: 'a', b: 'b'}]);
return {
  template: '
  <my-component
    myInput: myData,
    (myEvent)="myEventProp($event)"
  ></my-component>
  ',
  props: {
    myData: myObservable,
    myEventProp: $event => {
      myObservable.next([]);
      action('(myEvent)')($event);
    }
  }
};

}
`

これはAngularを䜿甚しお私にずっおはうたくいきたしたが、5行目でmyData.valueに倉曎したした

私はただこれを詊しおいたせん今のずころ叀いバヌゞョンのストヌリヌブックで立ち埀生しおいたすが、この問題は今すぐ解決できるようです。 匕数/コントロヌルの玠晎らしい䜜業に感謝したす

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡