Closed nayounsang closed 2 weeks ago
Latest commit: d2d545a4a4923dfdcebe9363e5ca1a774dd87de1
Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.
Click here to learn what changesets are, and how to add one.
Click here if you're a maintainer who wants to add a changeset to this PR
All modified and coverable lines are covered by tests :white_check_mark:
Project coverage is 82.27%. Comparing base (
63fbd3c
) to head (d2d545a
). Report is 1 commits behind head on main.
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
์์ controlled์ uncontrolled ์คํ ๋ฆฌ๋ฅผ ๋๋๋ ๊ฒ์ ์ด๋จ๊น์? Switch ์ ์์๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
controlled -> value์ ์ด๊ธฐ๊ฐ์ ์ฃผ๊ณ defaultValue ์ args๋ก ์ ๊ณตํ์ง ์๊ณ uncontrolled -> defaultValue์ ์ด๊ธฐ๊ฐ์ ์ฃผ๊ณ value ๋ฅผ args ๋ก ์ ๊ณตํ์ง ์๋๋ค
์ด๋ ๊ฒ ํ๋ฉด value๋ฅผ sanitize ํ ํ์๋ ์์ด์ง ๊ฒ ๊ฐ์์!
Slider
storybook ์ ๋๋ฉด ์ด๋จ๊น์?@yangwooseong
ํ์ง๋ง ๊ณ ๋ฏผ์ด ์์ด์. ๊ณตํต๋๋ props๋ค์ ๊ฐ์ meta์์ ์ ์ํ์ด์.
const meta: Meta<typeof Slider> = {
component: Slider,
argTypes: {
minStepsBetweenThumbs: {
control: {
type: 'number',
},
},
onValueChange: {
action: 'onValueChange',
},
onValueCommit: {
action: 'onValueCommit',
},
},
args:{
width: 285,
disabled: false,
guide: [5],
min: 0,
max: 10,
step: 1,
disableTooltip: false,
}
}
๊ทธ ๋ค ์คํ ๋ฆฌ๋ง๋ค ๋ณํํ๋ control์ด ์์ผ๋ฉด
export const Uncontrolled = Template.bind({})
Uncontrolled.args = {
defaultValue: [5],
}
์ถ๊ฐ์ ์ผ๋ก arg๋ฅผ ์ค์ ํด์ฃผ๋ ๋ฐฉ์์ด์์.
ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ meta
์์ ์ ์ธํ arg๊ฐ ์ ์ผ ๋จผ์ ์ค๊ณ ์คํ ๋ฆฌ๋ง๋ค ์ค์ ํ arg์ธ value
๋๋ defaultValue
๋ค์ด ํ์์๋ก ์์ ์ ๋๋ฐ์ด์ค์์ value์ defaultValue์ ๊ฒฝ์ฐ ์คํฌ๋กค์ ๋ด๋ ค์ผ ์ค์ ํ ์ ์์์ต๋๋ค.
์ด ๋ฐฉ๋ฒ๋ ๊ด์ฐฎ์์ง,
์๋๋ฉด const baseArgs:Partial<SliderProps> = {}
๋ ๋ณ๋์ ๊ฐ์ฒด์ ๋ ์คํ ๋ฆฌ ๋ชจ๋ ๊ณตํต๋๋ props๋ฅผ ์ค์ ํ๊ณ ๋ณต์ฌํ ์ง,
์๋๋ฉด ๊ฐ ์คํ ๋ฆฌ๋ง๋ค ํ์ํ ๋ชจ๋ arg๋ค์ ์ค์ ํ๋๊ฒ ์ข์์ง ๊ณ ๋ฏผ์ด๋ค์.
์ฐธ๊ณ ์ฌ์ง(์คํฌ๋กค์ ๋ด๋ ค์ผ value๋ฅผ ์ค์ ๊ฐ๋ฅํ ๋ชจ์ต)
ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ
meta
์์ ์ ์ธํ arg๊ฐ ์ ์ผ ๋จผ์ ์ค๊ณ ์คํ ๋ฆฌ๋ง๋ค ์ค์ ํ arg์ธvalue
๋๋defaultValue
๋ค์ด ํ์์๋ก ์์ ์ ๋๋ฐ์ด์ค์์ value์ defaultValue์ ๊ฒฝ์ฐ ์คํฌ๋กค์ ๋ด๋ ค์ผ ์ค์ ํ ์ ์์์ต๋๋ค.
export const Primary = {
args: {
value: [5],
},
} satisfies StoryObj<typeof meta>
export const Uncontrolled = {
args: {
defaultValue: [3, 7],
},
} satisfies StoryObj<typeof meta>
const meta: Meta<typeof Slider> = {
component: Slider,
argTypes: {
... // ์๋ต
value: {
if: {
exists: true,
arg: 'value',
},
},
defaultValue: {
if: {
exists: true,
arg: 'defaultValue',
},
},
},
}
@yangwooseong ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค.
2๋ฒ๊ฐ์ ๊ฒฝ์ฐ์ ์ง๋ฌธ์ด ์์ด์. ํ์ฌ meta์ ์ ์ธํ ๊ณตํต๋๋ arg์ argType์ value
์ defaultValue
๊ฐ ์กด์ฌํ์ง ์๊ณ
value
์ defaultValue
๋ Primary์ Uncontrolled ๊ฐ๊ฐ์ ์คํ ๋ฆฌ์์ ์ ์ํ๊ณ ์์ด์.
์ ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ ์คํ ๋ฆฌ๋ถ์ด ์จ๊ธฐ๋ ๊ฑธ๋ก ์๊ณ ์์ด์์. ์๋ฅผ๋ค์ด Uncontorlled๋ arg์ argType์ value
๊ฐ ์์ผ๋ฏ๋ก ์คํ ๋ฆฌ๋ถ์ด ์จ๊ธฐ๊ณ ์ ๋๋ฐ์ด์ค์์๋ ํ์ฌ ๊ทธ๋ ๊ฒ ๋ณด์ฌ์.
์ ๊ฐ ์๊ธฐ๋ก if
๋
parent: { control: 'select', options: ['one', 'two', 'three'] },
// ๐ Only shown when `parent` arg exists
parentExists: { if: { arg: 'parent', exists: true } },
์ด ์์ ๊ฐ์ด ์ด๋ค arg์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ arg๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋๋๋งํ๋ ๊ฑธ๋ก ์๊ณ ์์ด์ ์ง๋ฌธ๋๋ฆฝ๋๋ค
@yangwooseong ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค.
2๋ฒ๊ฐ์ ๊ฒฝ์ฐ์ ์ง๋ฌธ์ด ์์ด์. ํ์ฌ meta์ ์ ์ธํ ๊ณตํต๋๋ arg์ argType์
value
์defaultValue
๊ฐ ์กด์ฌํ์ง ์๊ณ
value
์defaultValue
๋ Primary์ Uncontrolled ๊ฐ๊ฐ์ ์คํ ๋ฆฌ์์ ์ ์ํ๊ณ ์์ด์.์ ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ ์คํ ๋ฆฌ๋ถ์ด ์จ๊ธฐ๋ ๊ฑธ๋ก ์๊ณ ์์ด์์. ์๋ฅผ๋ค์ด Uncontorlled๋ arg์ argType์
value
๊ฐ ์์ผ๋ฏ๋ก ์คํ ๋ฆฌ๋ถ์ด ์จ๊ธฐ๊ณ ์ ๋๋ฐ์ด์ค์์๋ ํ์ฌ ๊ทธ๋ ๊ฒ ๋ณด์ฌ์.์ ๊ฐ ์๊ธฐ๋ก
if
๋parent: { control: 'select', options: ['one', 'two', 'three'] }, // ๐ Only shown when `parent` arg exists parentExists: { if: { arg: 'parent', exists: true } },
์ด ์์ ๊ฐ์ด ์ด๋ค arg์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ arg๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋๋๋งํ๋ ๊ฑธ๋ก ์๊ณ ์์ด์ ์ง๋ฌธ๋๋ฆฝ๋๋ค
์ ๋ ๊ฐ๋ฐ๋ชจ๋์์๋ ์จ๊ฒจ์ง๋๋ฐ ๋ฐฐํฌ๋ ๊ฒ์ ๋ณด๋ฉด ์์จ๊ฒจ์ง๊ณ ๊ทธ๋๋ก ์์ด์์. ์์ ๋๊ธ์ ์๋ ์คํ ๋ฆฌ๋ถ ํ๋ฆฌ๋ทฐ๋ฅผ ๋ณด์๋ฉด ํ์ธ๊ฐ๋ฅํฉ๋๋ค https://github.com/channel-io/bezier-react/pull/2488#issuecomment-2461723767
๋ก์ปฌ์์ ๋ฐฐํฌํด์ ํ ์คํธ ํ๋ ค๋ฉด yarn workspace @channel.io/bezier-react storybook-build ๋ช ๋ น์ ํ์ฉํ์๋ฉด ๋ฉ๋๋ค
@yangwooseong ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค. 2๋ฒ๊ฐ์ ๊ฒฝ์ฐ์ ์ง๋ฌธ์ด ์์ด์. ํ์ฌ meta์ ์ ์ธํ ๊ณตํต๋๋ arg์ argType์
value
์defaultValue
๊ฐ ์กด์ฌํ์ง ์๊ณvalue
์defaultValue
๋ Primary์ Uncontrolled ๊ฐ๊ฐ์ ์คํ ๋ฆฌ์์ ์ ์ํ๊ณ ์์ด์. ์ ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ ์คํ ๋ฆฌ๋ถ์ด ์จ๊ธฐ๋ ๊ฑธ๋ก ์๊ณ ์์ด์์. ์๋ฅผ๋ค์ด Uncontorlled๋ arg์ argType์value
๊ฐ ์์ผ๋ฏ๋ก ์คํ ๋ฆฌ๋ถ์ด ์จ๊ธฐ๊ณ ์ ๋๋ฐ์ด์ค์์๋ ํ์ฌ ๊ทธ๋ ๊ฒ ๋ณด์ฌ์. ์ ๊ฐ ์๊ธฐ๋กif
๋parent: { control: 'select', options: ['one', 'two', 'three'] }, // ๐ Only shown when `parent` arg exists parentExists: { if: { arg: 'parent', exists: true } },
์ด ์์ ๊ฐ์ด ์ด๋ค arg์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ arg๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋๋๋งํ๋ ๊ฑธ๋ก ์๊ณ ์์ด์ ์ง๋ฌธ๋๋ฆฝ๋๋ค
์ ๋ ๊ฐ๋ฐ๋ชจ๋์์๋ ์จ๊ฒจ์ง๋๋ฐ ๋ฐฐํฌ๋ ๊ฒ์ ๋ณด๋ฉด ์์จ๊ฒจ์ง๊ณ ๊ทธ๋๋ก ์์ด์์. ์์ ๋๊ธ์ ์๋ ์คํ ๋ฆฌ๋ถ ํ๋ฆฌ๋ทฐ๋ฅผ ๋ณด์๋ฉด ํ์ธ๊ฐ๋ฅํฉ๋๋ค #2488 (comment)
๋ก์ปฌ์์ ๋ฐฐํฌํด์ ํ ์คํธ ํ๋ ค๋ฉด yarn workspace @channel.io/bezier-react storybook-build ๋ช ๋ น์ ํ์ฉํ์๋ฉด ๋ฉ๋๋ค
์! ๋ฐฐํฌํ๊ฒฝ์ ์๊ฐ ๋ชปํ๋ค์๐
fixํ ์ปค๋ฐ ๋ก์ปฌ์์ ํ
์คํธํ๊ณ ์ ์จ๊ฒจ์ง๋๋ค!
์ง๊ธ ๊ธฐ์ต๋๊ฑด๋ฐ control: false
๋ก ํน์ arg์ ๋ํ ์ปจํธ๋กค์ ์จ๊ฒผ๋ ๊ฒ ๊ฐ์๋ฐ ์ ๋ฐ ๋ฐฉ๋ฒ์ด ์์๊ตฐ์ ๋ฐฐ์๊ฐ๋๋ค๐
Self Checklist
Related Issue
close #2312
Summary
Details
First commit
- I don't like it, but using a `Template` was the solution I thought of. - The control that inputs the `array` in storybook requires `object` input. - Maybe, I can create a custom control using a `decorator`. I'm not sure because I haven't tried it yet. We also need to discuss how to use this to receive input. ```typescript const Template: StoryFnvalue
not 'defaultValue'.meta
of Slider such as width, min, max ...argTypes.if
.Breaking change? (Yes/No)
No
References
2312