-
-
Notifications
You must be signed in to change notification settings - Fork 9.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Regression with default value not being selected in Controls column #15378
Comments
This is the new intended behavior. Please see |
Thanks for pointing me to the relevant migration doc.
Could you help me understand what it means my "allowing the framework to supply the default value"? I'm struggling to understand what necessitated this change in behavior, as we'll need to duplicate default values in the component, as well as the story. |
Consider the react component: const Foo({ input = 'hello' }) => <div>{input}</div> Now consider two different ways of calling that function: const input = someAnalysisThatWillHopefullyProduceHelloButMightFail();
<Foo input={input} /> Alternatively: <Foo input={undefined} /> The former will display 'hello' in most cases, but can also fail in others. The latter will always product 'hello'. That's why we changed the default value handling in 6.3, to avoid the failure cases. To restore the 6.2 behavior, you can set the value of the arg to the desired input: export default {
title: 'Foo',
component: Foo,
args: { input: 'hello' }, // <== this line
}
const Template = (args) => <Foo {...args} />;
export const Default = Template.bind({}); |
Could this be an opt-in/opt-out feature? I understand that the aim was to let the users of Storybook decide exactly what the default value is to workaround the various ways of passing props and should be selected in the Controls, but I believe the way in which the components created by default via |
@Naoto-Ida nope, sorry. the arg handling code is already quite complex as is, and the new approach is far less bug-prone and also more self-consistent: if you want the control to be set to a value when you navigate to that story, set the arg in the story. |
@shilman would it be possible to just not pass any value at all to the props? The current behavior messes with our setup:
export interface AvatarProps {
/**
* The visual style of the avatar.
* @default "user"
*/
variant?: "user" | "entity";
/**
* The avatar size.
* @default "medium"
*/
size?: "xs" | "small" | "medium" | "large" | "xl" | "2xl";
}
const DEFAULT_PROPS = {
variant: "user",
size: "medium",
isButton: false,
} as const;
function Avatar(
props: AvatarProps
): ReactElement {
const propsWithDefaults = { ...DEFAULT_PROPS, ...props };
// ...
} This allows us to have:
This worked great for earlier versions of storybook, but now I have two issues:
This is an awkward situation, because if you look at the types, the component always expects some props to have a value (for example the Doesn't it suffice just not setting the props at all? Otherwise, this will force us to either not upgrade or change our whole codebase for a storybook quirk :/ By the way, I've also realized that this is only happening the second time a component is loaded in storybook. The first time, it's fine. This was one of the biggest head-scratchers I initially found :P Thank you! |
@DaniGuardiola Yes I think that could be a possibility; I'm just not sure about the impact of that change. @tmeasday WDYT? |
Wouldn't that function return undefined, and the component would use default value ('hello'), so both snippets should always display hello? I'm failing to see how choosing to not infer default values will help with that. But that's fine, it just seems like a slight breaking change in a minor release. I think the docs could use an improvement at least. |
No, the function could return some arbitrary string, like the name of a variable in your source file.
Here is the documentation: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecated-argtypedefaultvalue PRs are very welcome if you have specific ideas on how to make this more clear. |
I don't think there is any good reason why we would set the arg to |
Reading the original conversation between @Naoto-Ida and @shilman I feel like there is a misunderstanding somewhere. The only intended effect of the change in 6.3 was to not show the control with the initial value selected -- it shouldn't affect how the story/component is rendered. If it does, something unusual is happening, like what @DaniGuardiola described. Certaintly the build in "template" stories render the same AFAIK. @Naoto-Ida can you explain what you meant? |
@tmeasday thanks for your input, I understand better what's happening now. Just to be clear, here's the 3 related behaviors I've identified on 6.3 regarding defaults:
I understand that behavior 2 is intended and I understand and appreciate the goal. However, the other two are problematic in my opinion:
I can attempt to create a repro of behaviors 1 and 3 if that helps. If these behaviors are confirmed, would you consider both to be bugs? Or is anything intentional that I'm missing, especially regarding behavior 3? Thank you :) |
I agree, perhaps you could open a specific issue for this and we can take a look at it.
They should show up in the table, in the "default value" column, just not in the "control" column. Is that not the case in your examples? Our thinking is that we could probably make it clearer that this what's happening (that the control isn't showing anything because we are using the default), but we aren't going go back to trying to get proper values for args from strings (such as JSDoc comments) as it is too unreliable. |
@DaniGuardiola Thanks for sharing this workaround. The points which @DaniGuardiola listed all apply to us as well. What we ended up doing to get the original behavior back for behavior 1 and 2 are to do something similar to the following:
Note that this example is in JS but we now take a similar approach to our other Storybook which has Typescript (but with default arg values by destructuring |
For what it's worth, we encountered this issue in our Footer component where we were setting a 'Container' component as a default prop (not something we expect Storybook to be concerned with) but Storybook 6.3+ sets this to undefined, causing the component to throw an error. We also seem to have an issue with storyshots 6.2.9 exhibiting the same issue (although it renders fine in Storybook 6.2.9). |
@penx 👋 - so the issue here is that it is setting it to |
@tmeasday yes that seems to be what's happening. Here's an example repo using Storybook 6.2.9 that shows what seems to be the same issue in storyshots: https://github.com/penx/storyshots-default-props const Footer = ({ container: Container, a, b }) => <Container>{a} {b}</Container>;
Footer.propTypes = {
container: PropTypes.elementType,
a: PropTypes.string,
};
Footer.defaultProps = {
container: 'div',
a: 'A',
b: 'B',
}; https://github.com/penx/storyshots-default-props/blob/master/src/stories/Footer.jsx Note:
|
@penx in your example, your story is defined: ( which is wrong (it should be If you make that change, then (a) in In (b) I can see the |
Thanks @tmeasday, that makes sense now. |
@tmeasday In our case, the default value column just results in |
Hi @TristanWatanabe - that sounds like a separate issue I guess, docgen is not working properly in your case? |
We’re cleaning house! Storybook has changed a lot since this issue was created and we don’t know if it’s still valid. Please open a new issue referencing this one if:
|
Describe the bug
We've been loving Storybook with our Typescript setup, but after upgrading from 6.2.9 to 6.3.0, we've lost the feature to have SB select the default value in the Controls column.
For example, in the demo files produced with
npx sb init
, aButton.tsx
is created.Its
size
prop has a default value ofmedium
, but the RadioControl does not select the radio option labeledmedium
anymore.To Reproduce
I have a very simple reproduction repo which simply ran
npx sb@next repro
with no manual configurations.System
Environment Info:
System:
OS: macOS 11.4
CPU: (8) x64 Intel(R) Core(TM) i7-1068NG7 CPU @ 2.30GHz
Binaries:
Node: 12.20.2 - ~/rg/community/bin/build/nodejs/bin/node
Yarn: 1.22.5 - ~/rg/community/bin/build/yarn/bin/yarn
npm: 6.14.11 - ~/rg/community/bin/build/nodejs/bin/npm
Browsers:
Chrome: 91.0.4472.114
Firefox: 89.0
Safari: 14.1.1
Additional context
I'm not that familiar with SB's codebase, but what I can tell is that the
value
prop for RadioControl isundefined
.The only time this is not
undefined
is when the Story supplies it via theargs
property, i.e.The text was updated successfully, but these errors were encountered: