Я работаю над базовым индексным приложением для поиска выпускников, используя VulcanJS. Он использует Реакт. Я использую гламурный для укладки. Он действительно чистый и простой в использовании. Он вдохновлен гламуром, еще одним очень популярным решением css в js, созданным потрясающим Безумным ученым Сунил Пай.

Я хотел создать компонент, который просто берет кучу строк, заключает их в выбранный элемент HTML и выделяет их текстовые узлы жирным шрифтом. Это казалось простым, но для этого нужно знать некоторые основы React, в которые я никогда не вникал до сих пор. Забавно, что я просто продолжал использовать его по минимуму. Только сейчас, когда я долго работаю над чем-то своим в React, я начал лучше изучать нюансы React. Хорошо, теперь займемся компонентом.

Ниже приведены строки, которые я хотел обернуть в диапазон, чей fontWeight выделен полужирным шрифтом.

const labelStrings = new Set([
  "Twitter Handle",
  "Facebook Profile",
  "Website",
  "Linkedin ID",
  "Roll No",
  "Branch",
  "Graduating Year",
  "Degree Type",
  "Company Or University",
  "Bio"
])

Обычно предпочтительнее, чтобы вы хранили свои реагирующие компоненты в отдельных модулях/файлах. Но в этом случае, чтобы иметь возможность сделать метод рендеринга чище, я создал пространство имен для хранения всех этих похожих реагирующих компонентов (в основном выделенные полужирным шрифтом интервалы).

const LabelComponents = {}; // namespace

Теперь, поскольку мне нужен диапазон (и его можно сделать более общим, передав тип HTML-элемента в самом реквизите), я оборачиваю его в гламурный компонент более высокого порядка (который просто оборачивает голый тег span с помощью fontWeight), я беру реквизит text для текстового узла диапазона и просто возвращаю стилизованный диапазон. Ничего страшного, все основное.

const BoldSpanComponent = ({text, fontWeight}) => {
  const StyledSpan = glamorous.span({
    fontWeight: fontWeight
  })
  return (
    <StyledSpan>{text}: </StyledSpan>
  )
}

BoldSpanComponent.propTypes = {
  text: PropTypes.string.isRequired,
  fontWeight: PropTypes.string
}

Теперь я переберу набор строк в наборе и верну BoldSpan для каждой из них и заставлю их находиться в компоненте в пространстве имен, например:

for (let label of labelStrings) {
// remove the white spaces in the string
 const noSpaceLabel = label.replace(/\s/g,''); 
  LabelComponents[noSpaceLabel] = () => {
    return <BoldSpanComponent text={label} fontWeight="bold" />
  }
}

вы можете прочитать больше о том, что такое \s в регулярном выражении здесь.

И теперь я просто использую их все так:

<ul>
      {user.twitterUsername ? 
        <li>
          <LabelComponents.TwitterHandle />
          <a href={"http://twitter.com/" + user.twitterUsername}>@{user.twitterUsername}</a>
        </li> : null }

      {user.services.fbProfileLink ? 
        <li> 
          <LabelComponents.FacebookProfile />
          <a href={user.services.fbProfileLink}>FB Profile Link</a>
        </li> : null}

      {user.website ? 
        <li>
          <LabelComponents.Website />
          <a href={user.website}>{user.website}</a>
        </li> : null }

      <li>
        <LabelComponents.LinkedinID />
        <a href={user.linkedinId}>{user.linkedinId}</a>
      </li>

      <li>
        <LabelComponents.RollNo />
        {user.rollNoOrRegNo}
      </li>

      <li>
        <LabelComponents.Branch />
        {user.branch}
      </li>

      <li>
        <LabelComponents.GraduatingYear />
        {user.classOf}
      </li>

      <li>
        <LabelComponents.DegreeType />
        {user.levelOfDegree}
      </li>

      <li>
         <LabelComponents.CompanyOrUniversity />
        {user.currentUniCompOccu}
      </li>
    </ul>

Я все еще новичок в веб-разработке, разработке программного обеспечения, лучших практиках, реакции. Вы можете оставить предложения по улучшению этого небольшого компонента! Спасибо за чтение!

Впервые опубликовано в моем блоге: