#reactjs #typescript #jss #css-in-js
#reactjs #typescript #jss #css-in-js
Вопрос:
Я пытаюсь получить доступ к состоянию моего компонента в useStyles
методе, созданном с использованием пакета react-jss. Код кажется правильным для javascript, но не для typescript, согласно тому, что я нашел в Интернете.
import { createUseStyles } from 'react-jss';
const useStyles = createUseStyles({
myClass: {
height: `${height}px`, // <== squiggly line here since I don't know how to pass the parameters
},
});
export function Collapse() {
const [height, setHeight] = useState(18);
const classes = useStyles(height);
return (
<div>...</div>
);
}
Как я могу этого добиться?
Комментарии:
1. const useStyles = createUseStyles({ MyClass: props => ({ height:
${props.height}px
}) });2. Спасибо, я обновил свой код. Я не могу использовать здесь реквизит. Также
props
неизвестно.3. Я обновил свой код. Пожалуйста, проверьте. Пожалуйста, обратитесь к ссылке github.com/cssinjs/jss/issues/1273
4. Большое вам спасибо, мне удалось добиться того, чего я хотел.
5. @Ploppy Рассмотрите возможность публикации ответа на ваш вопрос, если вы нашли решение самостоятельно / с помощью комментариев. Это поможет любому, кто столкнется с этим вопросом, поскольку ссылка от K.Raj может со временем стать недоступной.
Ответ №1:
Использование функции в моих стилях позволяет мне получить доступ к нужному параметру.
import { createUseStyles } from 'react-jss';
const useStyles = createUseStyles({
myClass: props => ({
height: `${height}px`,
}),
});
export function Collapse() {
const [height, setHeight] = useState(18);
const classes = useStyles({height: height});
return (
<div>...</div>
);
}
Ответ №2:
лучше сделать типы понятными, когда вы используете jss
и typescript
вместе. в этом случае вам нужно указать тип параметров, которым вы хотите их передать jss
. (прочитайте эту статью для лучшего понимания)
в версии 10.6.0 они добавили функцию для указания типов параметров, которым вы их передаете jss
, более удобным способом. jss
в вашем случае, прежде всего, мы точно указываем имена классов и типы:
import { Classes, Styles } from "jss";
import { createUseStyles } from "react-jss";
type CollapseStyleProps = { height?: number };
type CollapseClassNames = "myClass";
type CollapseClasses = Classes<CollapseClassNames>;
type CollapseStyles = Styles<CollapseClassNames, CollapseStyleProps>; //we specify types of props here
а затем мы напишем стили в jss
:
const getStyles: CollapseStyles = {
myClass: {
height: ({ height }) => height,
transition: "500ms"
}
};
const useCollapseStyle: (data?: any) => CollapseClasses = createUseStyles(getStyles);
теперь на последнем шаге приступайте к реализации Collapse
самого компонента:
function Collapse() {
const [height, setHeight] = useState(18);
const classes = useCollapseStyle({ height });
const heightHandler = () => {
height === 18 ? setHeight(108) : setHeight(18);
};
return (
<div>
<div className={classes.myClass}>Test App</div>
<button onClick={heightHandler}>toggle height</button>
</div>
);
}
вы можете увидеть рабочий пример здесь, в codesandbox