当前位置: 首页 > 知识库问答 >
问题:

对样式化组件使用react-native-vector-icons/font awesome

房泉
2023-03-14

我正在重构一些React Native代码以使用样式化组件,但在设计FontAwesome图标时遇到了问题。我得到一个错误,例如

样式组件2.default.图标字体真棒不是一个函数

所以我理解这个GitHub问题,我需要包装组件并根据扩展自定义组件的文档传递class Nameprop。所以我有这个:

import React from 'react';
import {
  Text,
  TouchableOpacity,
} from 'react-native';
import PropTypes from 'prop-types';
import IconFontAwesome from 'react-native-vector-icons/FontAwesome';
import styled from 'styled-components';

const StyledTouchableOpacity = styled.TouchableOpacity`
  width: ${props => (props.large ? '100%' : '80%')};
  height: ${props => (props.large ? '80px' : '60px')};
  font-size: ${props => (props.large ? '18px' : '15px')};
  background: '#f1d746';
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 20px;
`;

const StyledText = styled.Text`
  font-size: 15;
  font-weight: bold;
`;

const StylableIcon = ({ className }) => (
  <IconFontAwesome className={className} />
);

const StyledIconFontAwesome = styled.StylableIcon`
  font-size: 15;
  padding: 10px;
`;

const Button = (props) => {
  let _icon = null;

  if (props.icon) {
    _icon = (
      <StyledIconFontAwesome name={props.icon} />
    );
  }

  return (
    <StyledTouchableOpacity>
      <StyledText>{props.text}</StyledText>
      {_icon}
    </StyledTouchableOpacity>
  );
};

Button.defaultProps = {
  icon: null,
};

Button.propTypes = {
  icon: PropTypes.string,
};

export default Button;

这会导致类似的错误

styledComponents2.default。StylableIcon不是函数

关于我在这里做错了什么,有什么建议吗?谢谢大家。

共有1个答案

刘明朗
2023-03-14

好的,让它工作:

import React from 'react';
import {
  Text,
  TouchableOpacity,
} from 'react-native';
import PropTypes from 'prop-types';
import IconFontAwesome from 'react-native-vector-icons/FontAwesome';
import styled from 'styled-components';

const StyledTouchableOpacity = styled.TouchableOpacity`
  width: ${props => (props.large ? '100%' : '80%')};
  height: ${props => (props.large ? '80px' : '60px')};
  font-size: ${props => (props.large ? '18px' : '15px')};
  background: '#f1d746';
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 20px;
`;

const StyledText = styled.Text`
  font-size: 15;
  font-weight: bold;
`;

const StyledIconFontAwesome = styled(IconFontAwesome)`
  font-size: 15;
  padding: 10px;
`;

const Button = (props) => {
  let _icon = null;

  if (props.icon) {
    _icon = (
      <StyledIconFontAwesome name={props.icon} />
    );
  }

  return (
    <StyledTouchableOpacity>
      <StyledText>{props.text}</StyledText>
      {_icon}
    </StyledTouchableOpacity>
  );
};

Button.defaultProps = {
  icon: null,
};

Button.propTypes = {
  icon: PropTypes.string,
};

export default Button;

所以这里有两个修复:

  1. 必须使用语法styled(Something),而不是styled。一些(谢谢@bennygenel)
  2. 包装StylableIcon是不必要的。我可以直接调用styled(IconFontAwesome)
 类似资料:
  • Button组件通常由Text元素组成,该元素用TouchableHighlight(或其他touchable)包装。我正在尝试创建一个使用styled-components样式的按钮组件,但是我的样式很难动态响应道具。 下面,我创建了一个按钮组件,类似于样式化组件文档中的Adapting based on props示例。 导入后,我用的按钮是这样的... 所以,我希望我的纽扣看起来像这样...

  • react-native-icons 是 React Native 简单易用的图标组件,包括 5 种不同的图标字体和 2,444 个图标。 当前支持 5 种字体: FontAwesome 4.4 包含 585 icons ionicons 2.0.0 包含 733 icons,以及许多iOS 7风格概述图标 Foundation icons 包含 283 icons Zocial 包含 99 so

  • 我刚刚开始尝试react native,并且正在遵循一些官方文档。 我从官方文档的样式和大小部分了解到,样式系统与css非常相似,但并不完全相同。(?) Q1:我可以只使用样式化的组件并使用“填充:20px”等,而不用担心不同类型的设备吗? 我问这个,因为文档说: React Native中的所有维度都是无单位的,表示与密度无关的像素。 此报价仅针对宽度和高度吗?。默认情况下是否有像素密度转换,或

  • 我在React web上使用样式化组件已经有一段时间了,但最近我开始开发一个React Native应用程序,我决定在中使用样式化的组件。当设计只有属性的组件时,比如默认的components,这是非常好的。 但是,我遇到的问题是,当我需要为具有多个样式属性的更复杂的组件设置样式时,例如、等。 当只有一个样式属性具有不同的名称时,我可以执行以下操作: 这完美无缺,但是当组件具有多种样式时,我不知道

  • jsx 使用上面的代码,im得到控制台错误: