使用 React.createElement 创建样式组件
Creating styled-component with React.createElement
我想创建一个带有函数的 styled-component
,将 element 作为参数,我用 React.createElement
调用创建它。
const StyledComponent = (element) => styled(element)`
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
`;
const myComponent = (props) => {
const element = React.createElement('div', null, `Hello World!`);
return (
StyledComponent(element)
);
}
这会导致以下错误:
Uncaught Error: Cannot create styled-component for component: [object Object].
我可能遗漏了什么,但我无法弄明白。
您无法创建渲染的 React 节点的 HOC。下面一行是渲染调用:
const element = React.createElement('div', null, `Hello World!`);
// this is the same as:
const element = <div >Hello World</div>
您可能想要用实际功能组件替换 createElement
:
const element = () => React.createElement('div', null, `Hello World!`);
// this is the same as:
const element = () => <div >Hello World</div>
现在您可以创建样式化组件并渲染它。完整(相关)代码:
const element = () => React.createElement('div', null, `Hello World!`);
const SComponent = StyledComponent(element);
return React.createElement(SComponent);
让事情变得简单
import styled from 'styled-component'//import library for making styled components
例如,如果想创建一个基于 <p></p>
的样式化组件,您可以这样做:
const MyP=styled.p
color:red;
font-size:10px;
font-weight:bold
;
您可以随心所欲地投放广告 css
定义。
现在开始使用它:
const MyComponent=()=>{
<MyP>
Hello
</MyP>
}
在这里您可以使用 'p'(未设置样式)代替 'MyP'。
它也适用于 const MyComponent=React.creatElement(MyP,null,'Hello');
希望对您有所帮助
Felix 答案 几乎 正确,但您仍然需要在 className 属性内联组件函数,以便应用您的 样式化组件 中定义的样式。
我能够找到正确的答案,我决定使用JSX-syntax,如果你需要通过 refs,改用React.cloneElement。
完整示例:
const StyleMyElement = (Element) => styled(({ className }) => <Element.type {...Element.props} className={className} />)`
position: absolute;
top: 0;
...
`;
...
const element = () => React.createElement('div', null, `Hello World!`);
const StyledComponent = StyleMyElement(element);
return (
<StyledComponent />
)
从 styled-components
v4 开始,您只需使用 as
prop 即可轻松完成此操作。
来自文档:
If you want to keep all the styling you've applied to a component but just switch out what's being ultimately rendered (be it a different HTML tag or a different custom component), you can use the "as" prop to do this at runtime.
import styled from "styled-components";
const Component = styled.div`
color: red;
`;
render(
<Component
as="button"
onClick={() => alert('It works!')}
>
Hello World!
</Component>
)
我是这样实现的:
组件:
export default function StyledCustomComponent({tag, className, children}) {
const customTag = React.createElement(tag);
const StyledCustomElement = styled(customTag.type)`
"some css rules"
`
return (
<StyledCustomElement {...className}>
{children}
</StyledCustomElement>
)
}
然后在另一个文件中调用该组件:
<StyledCustomElement tag='div'> Some content <StyledCustomElement/>
希望对您有所帮助!
我想创建一个带有函数的 styled-component
,将 element 作为参数,我用 React.createElement
调用创建它。
const StyledComponent = (element) => styled(element)`
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
`;
const myComponent = (props) => {
const element = React.createElement('div', null, `Hello World!`);
return (
StyledComponent(element)
);
}
这会导致以下错误:
Uncaught Error: Cannot create styled-component for component: [object Object].
我可能遗漏了什么,但我无法弄明白。
您无法创建渲染的 React 节点的 HOC。下面一行是渲染调用:
const element = React.createElement('div', null, `Hello World!`);
// this is the same as:
const element = <div >Hello World</div>
您可能想要用实际功能组件替换 createElement
:
const element = () => React.createElement('div', null, `Hello World!`);
// this is the same as:
const element = () => <div >Hello World</div>
现在您可以创建样式化组件并渲染它。完整(相关)代码:
const element = () => React.createElement('div', null, `Hello World!`);
const SComponent = StyledComponent(element);
return React.createElement(SComponent);
让事情变得简单
import styled from 'styled-component'//import library for making styled components
例如,如果想创建一个基于 <p></p>
的样式化组件,您可以这样做:
const MyP=styled.p
color:red;
font-size:10px;
font-weight:bold
;
您可以随心所欲地投放广告 css
定义。
现在开始使用它:
const MyComponent=()=>{
<MyP>
Hello
</MyP>
}
在这里您可以使用 'p'(未设置样式)代替 'MyP'。
它也适用于 const MyComponent=React.creatElement(MyP,null,'Hello'); 希望对您有所帮助
Felix 答案 几乎 正确,但您仍然需要在 className 属性内联组件函数,以便应用您的 样式化组件 中定义的样式。
我能够找到正确的答案
完整示例:
const StyleMyElement = (Element) => styled(({ className }) => <Element.type {...Element.props} className={className} />)`
position: absolute;
top: 0;
...
`;
...
const element = () => React.createElement('div', null, `Hello World!`);
const StyledComponent = StyleMyElement(element);
return (
<StyledComponent />
)
从 styled-components
v4 开始,您只需使用 as
prop 即可轻松完成此操作。
来自文档:
If you want to keep all the styling you've applied to a component but just switch out what's being ultimately rendered (be it a different HTML tag or a different custom component), you can use the "as" prop to do this at runtime.
import styled from "styled-components";
const Component = styled.div`
color: red;
`;
render(
<Component
as="button"
onClick={() => alert('It works!')}
>
Hello World!
</Component>
)
我是这样实现的:
组件:
export default function StyledCustomComponent({tag, className, children}) {
const customTag = React.createElement(tag);
const StyledCustomElement = styled(customTag.type)`
"some css rules"
`
return (
<StyledCustomElement {...className}>
{children}
</StyledCustomElement>
)
}
然后在另一个文件中调用该组件:
<StyledCustomElement tag='div'> Some content <StyledCustomElement/>
希望对您有所帮助!