如何应用基于道具的样式?
How to apply styles based on props?
我正在使用 React 和 Material-ui,目前我正在做类似下面代码的事情。
有没有更好的方法?
例如,是否有一个函数允许您在组件下方的 "styles" jss 对象中访问 'props',最终使用 withStyles() 注入到组件中,而无需执行所有操作这个丑陋的内联样式?
import React from 'react';
import {
MaterialComponentOne,
MaterialComponentTwo,
MaterialComponentThree,
} from '@material-ui/core';
function MyPureComponent(props) {
return (
<MaterialComponentOne
style={
props.type === 'secondary'
? {
css_property: 'css_value1',
}
: {
css_property: 'css_value2',
}
}
className={props.classes.MaterialComponentOne}
position="static"
>
<MaterialComponentTwo>
<MaterialComponentThree
style={
props.type === 'secondary'
? {
css_property: 'css_value1',
}
: {
css_property: 'css_value2',
}
}
variant="title"
className={props.classes.MaterialComponentThree}
>
{props.title}
</MaterialComponentThree>
</MaterialComponentTwo>
</MaterialComponentOne>
);
}
const styles = {
MaterialComponentOne: {
css_property: 'css_value',
css_property: 'css_value',
},
MaterialComponentTwo: {
css_propery: 'css_value',
},
};
export default withTheme()(withStyles(styles)(MyPureComponent));
谢谢。
您可以使用 styled-components.
基于文档的示例 Adapting based on props:
import styled from 'styled-components';
const Button = styled.button`
background: ${props => props.primary ? 'palevioletred' : 'white'};
color: ${props => props.primary ? 'white' : 'palevioletred'};
`;
function MyPureComponent(props) {
return (
<div>
<Button>Normal</Button>
<Button primary>Primary</Button>
</div>
);
}
您可以使用 clsx library which comes with Material UI or classnames 库来有条件地将类名连接在一起。下面的示例是使用类名库显示的,您也可以使用 clsx 库来实现相同的结果。
import React from 'react';
import {
MaterialComponentOne,
MaterialComponentTwo,
MaterialComponentThree,
} from '@material-ui/core';
import classNames from "classnames"
function MyPureComponent(props) {
return (
<MaterialComponentOne
position="static"
className={classNames(
props.classes.MaterialComponentOne,
{[props.classes.classOne]: props.type === 'secondary'},
{[props.classes.classTwo]: props.type !== 'secondary'}
)}
>
<MaterialComponentTwo>
<MaterialComponentThree
variant="title"
className={classNames(
props.classes.MaterialComponentThree,
{"props.classes.classOne": props.type === 'secondary'},
{"props.classes.classTwo": props.type !== 'secondary'}
)}
>
{props.title}
</MaterialComponentThree>
</MaterialComponentTwo>
</MaterialComponentOne>
);
}
const styles = {
MaterialComponentOne: {
css_property: 'css_value',
css_property: 'css_value',
},
MaterialComponentTwo: {
css_propery: 'css_value',
},
classOne: {
css_property: 'css_value',
},
classTwo: {
css_property: 'css_value'
}
};
export default withTheme()(withStyles(styles)(MyPureComponent));
classNames
函数接受任意数量的参数,可以是字符串或对象。参数 'foo'
是 { foo: true}
的缩写。如果与给定键关联的值是假的,则该键将不会包含在输出中。
classNames('foo', 'bar'); // => 'foo bar'
classNames('foo', { bar: true }); // => 'foo bar'
classNames({ 'foo-bar': true }); // => 'foo-bar'
classNames({ 'foo-bar': false }); // => ''
classNames({ foo: true }, { bar: true }); // => 'foo bar'
classNames({ foo: true, bar: true }); // => 'foo bar'
// lots of arguments of various types
classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
// other falsy values are just ignored
classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
一种自然的方法是将 createStyles 挂钩与 makeStyles 和 useStyles 一起使用。您可以在要设置样式的元素中使用道具名称,方法是将其设为 returns 样式的箭头函数。此外,您还可以在 createStyles 挂钩内设置其他元素的样式。这花了我一些时间,我希望有人觉得它有用。 ✨
下面是作为另一个问题的答案提供的代码:()
import { makeStyles, createStyles, Theme } from "@material-ui/core/styles";
...
...
const classes = useStyles();
...
...
const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: propName => ({
border: "none",
boxShadow: "none",
cursor: propName ? "pointer" : "auto",
width: "100%",
backgroundColor: "#fff",
padding: "15px 15px"
}),
updated: {
marginTop: 12,
fontWeight: 400,
color: "#939393"
}
})
);
我正在使用 React 和 Material-ui,目前我正在做类似下面代码的事情。
有没有更好的方法?
例如,是否有一个函数允许您在组件下方的 "styles" jss 对象中访问 'props',最终使用 withStyles() 注入到组件中,而无需执行所有操作这个丑陋的内联样式?
import React from 'react';
import {
MaterialComponentOne,
MaterialComponentTwo,
MaterialComponentThree,
} from '@material-ui/core';
function MyPureComponent(props) {
return (
<MaterialComponentOne
style={
props.type === 'secondary'
? {
css_property: 'css_value1',
}
: {
css_property: 'css_value2',
}
}
className={props.classes.MaterialComponentOne}
position="static"
>
<MaterialComponentTwo>
<MaterialComponentThree
style={
props.type === 'secondary'
? {
css_property: 'css_value1',
}
: {
css_property: 'css_value2',
}
}
variant="title"
className={props.classes.MaterialComponentThree}
>
{props.title}
</MaterialComponentThree>
</MaterialComponentTwo>
</MaterialComponentOne>
);
}
const styles = {
MaterialComponentOne: {
css_property: 'css_value',
css_property: 'css_value',
},
MaterialComponentTwo: {
css_propery: 'css_value',
},
};
export default withTheme()(withStyles(styles)(MyPureComponent));
谢谢。
您可以使用 styled-components.
基于文档的示例 Adapting based on props:
import styled from 'styled-components';
const Button = styled.button`
background: ${props => props.primary ? 'palevioletred' : 'white'};
color: ${props => props.primary ? 'white' : 'palevioletred'};
`;
function MyPureComponent(props) {
return (
<div>
<Button>Normal</Button>
<Button primary>Primary</Button>
</div>
);
}
您可以使用 clsx library which comes with Material UI or classnames 库来有条件地将类名连接在一起。下面的示例是使用类名库显示的,您也可以使用 clsx 库来实现相同的结果。
import React from 'react';
import {
MaterialComponentOne,
MaterialComponentTwo,
MaterialComponentThree,
} from '@material-ui/core';
import classNames from "classnames"
function MyPureComponent(props) {
return (
<MaterialComponentOne
position="static"
className={classNames(
props.classes.MaterialComponentOne,
{[props.classes.classOne]: props.type === 'secondary'},
{[props.classes.classTwo]: props.type !== 'secondary'}
)}
>
<MaterialComponentTwo>
<MaterialComponentThree
variant="title"
className={classNames(
props.classes.MaterialComponentThree,
{"props.classes.classOne": props.type === 'secondary'},
{"props.classes.classTwo": props.type !== 'secondary'}
)}
>
{props.title}
</MaterialComponentThree>
</MaterialComponentTwo>
</MaterialComponentOne>
);
}
const styles = {
MaterialComponentOne: {
css_property: 'css_value',
css_property: 'css_value',
},
MaterialComponentTwo: {
css_propery: 'css_value',
},
classOne: {
css_property: 'css_value',
},
classTwo: {
css_property: 'css_value'
}
};
export default withTheme()(withStyles(styles)(MyPureComponent));
classNames
函数接受任意数量的参数,可以是字符串或对象。参数 'foo'
是 { foo: true}
的缩写。如果与给定键关联的值是假的,则该键将不会包含在输出中。
classNames('foo', 'bar'); // => 'foo bar'
classNames('foo', { bar: true }); // => 'foo bar'
classNames({ 'foo-bar': true }); // => 'foo-bar'
classNames({ 'foo-bar': false }); // => ''
classNames({ foo: true }, { bar: true }); // => 'foo bar'
classNames({ foo: true, bar: true }); // => 'foo bar'
// lots of arguments of various types
classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'
// other falsy values are just ignored
classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'
一种自然的方法是将 createStyles 挂钩与 makeStyles 和 useStyles 一起使用。您可以在要设置样式的元素中使用道具名称,方法是将其设为 returns 样式的箭头函数。此外,您还可以在 createStyles 挂钩内设置其他元素的样式。这花了我一些时间,我希望有人觉得它有用。 ✨
下面是作为另一个问题的答案提供的代码:(
import { makeStyles, createStyles, Theme } from "@material-ui/core/styles";
...
...
const classes = useStyles();
...
...
const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: propName => ({
border: "none",
boxShadow: "none",
cursor: propName ? "pointer" : "auto",
width: "100%",
backgroundColor: "#fff",
padding: "15px 15px"
}),
updated: {
marginTop: 12,
fontWeight: 400,
color: "#939393"
}
})
);