Рубрики
Без рубрики

Как написать простую плагин поиска по реагированию, опубликуйте его на NPM и разверните его на страницы GitHub

Nirmalya Ghosh в этой статье мы собираемся написать простой поисковый плагин в реакции. Благодаря этой статье я надеюсь помочь собратьям-разработчикам понять, как писать плагины, используя React, опубликовать их в NPM и развернуть демонстрацию на страницах GitHub. Исходный код плагина

Автор оригинала: FreeCodeCamp Community Member.

Нирмаля Гош

В этой статье мы собираемся написать простой плагин поиска в Реагировать Отказ Благодаря этой статье я надеюсь помочь собратьям понять, как писать плагины, используя React, опубликовать их на NPM и разверните демонстрацию на страницах GitHub.

Исходный код плагина доступен на Github Отказ

Начиная

Мы собираемся загрузить наш плагин, используя Create-ractive-библиотека который является CLI для легко создания многоразовых библиотек React React. Эта CLI есть куча Особенности И поможет нам в создании котельной для нашего плагина.

Чтобы использовать Create-raction-библиотеку, нам нужно будет установить ее глобально:

npm install -g create-react-library

Приведенная выше команда будет установлена глобально, и мы можем генерировать новый модуль из любого каталога. Чтобы генерировать новый каталог, введите следующую команду в каталоге, где вы хотите загрузить плагин:

create-react-library

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

Теперь вам нужно запустить плагин (за просмотр любых изменений, которые вы делаете к нему) и пример. На одной вкладке вы можете запустить:

cd react-search-box && yarn start

И, на другой вкладке, вам нужно запустить примерное приложение:

cd react-search-box/example && yarn start

Последняя команда будет работать Create-React-App Проект, который импортирует ваш плагин. Если вы внесите какие-либо изменения в плагин, он будет отражаться в приведенном приложении. Вы можете просмотреть текущее состояние вашего плагина, посетив http://localhost: 3000 Отказ

Проектирование коробки ввода

Добавим первую основную функциональность: входное поле, которое позволило бы пользователям вводить его.

import React, { Component } from 'react'import PropTypes from 'prop-types'
import styles from './styles.css'
export default class ReactSearchBox extends Component {  static propTypes = {    /**     * value: The default value for the input box.     * placeholder: The placeholder text for the input box.     */    value: PropTypes.string,    placeholder: PropTypes.string  }
  state = {    value: ''  }
  componentDidMount() {    const { value } = this.props
    this.setState({      value: value    })  }
  handleInputChange = e => {    const { value } = e.target
  this.setState({      value: value    })  }
  inputNode = () => {    /**     * This function is responsible for rendering the input box.     * The input box acts as a source of entry for the data from the user.     */    const { placeholder } = this.props    const { value } = this.state
    return (          )  }
  render() {    return 
{this.inputNode()}
}}

В приведенном выше коде мы создаем входной элемент, который имеет классное значение атрибут, а Тип атрибут, а Зажигатель атрибут, а ценность атрибут и Onchange обработчик. Большинство из них очень основные реквизиты. Единственный интересный опорный – это Onchange опоры, который срабатывает всякий раз, когда пользовательские типы в поле ввода.

Всякий раз, когда есть изменение в поле ввода, мы называем HandlinPutchange функция. HandlinPutchange Функция получает событие в качестве аргумента для него. Мы используем ES6 Arrow Функция здесь. Итак, нам не нужно явно связаться это с HandlinPutchange функция. Вы можете прочитать Когда я должен использовать функции стрелки с React По Джеймс К Нельсон Отказ

Так как у нас есть ценность Состояние, которое мы передаем в поле ввода в качестве атрибута, мы обновляем, что ценность Состояние всякий раз, когда есть изменение в поле ввода через HandlinPutchange функция.

handleInputChange = e => {  const { value } = e.target
  this.setState({    value  })}

Если вы посетите http://localhost: 3000 Вы увидите поле ввода на экране. Вы можете ввести в поле ввода, и значение будет обновлено.

Если вы проверяете Инструменты разработчика реагирования , вы увидите, что значение ввода ввода обновляется.

Это все функциональные возможности, которые нам нужны для коробки ввода. Далее мы разработаем раскрывающееся раскрывание, которое появится после того, как строка, которую пользователь ввода в поле ввода, соответствует любой записи, которая будет поставляться в наш плагин через данные пропры

Проектирование раскрывающегося списка

В этом разделе мы собираемся реализовать выпадать, который появится с массивом записей, которые совпадают со строкой, которые пользовательские типы в поле ввода. Начальный массив записей будет поставляться с использованием данные опоры, который мы будем реализовать первым.

import React, { Component } from "react";import ReactSearchBox from "react-search-box";
export default class App extends Component {  data = [    {      key: "john",      value: "John Doe"    },    {      key: "jane",      value: "Jane Doe"    },    {      key: "mary",      value: "Mary Phillips"    },    {      key: "robert",      value: "Robert"    },    {      key: "karius",      value: "Karius"    }  ];
  render() {    return (      
); }}

Наш плагин должен быть импортирован и определяется как приведенный выше блок кода. Вы импортируете ReactSearchbox а затем вы передаете массив объектов (MADE Data Array в этом случае) для ReactSearchbox Отказ

На данный момент мы сделаем раскрытие, если ценность опоры передается на наш плагин. Позже мы воспринимаем наш компонент, чтобы показать выпадение, если какая-либо запись из данные опоры с прилагаемыми ценность пропры

Наш плагин теперь будет выглядеть что-то вроде следующего:

import React, { Component } from 'react'import PropTypes from 'prop-types'
import styles from './styles.css'
export default class ReactSearchBox extends Component {  static propTypes = {    /**     * value: The default value for the input box.     * placeholder: The placeholder text for the input box.     * data: An array of objects which acts as the source of data for the dropdown.     */    value: PropTypes.string,    placeholder: PropTypes.string,    data: PropTypes.array.isRequired  }
  static defaultProps = {    /**     * Set data prop as an empty array in case it's not passed.     */    data: []  }
  state = {    value: ''  }
  componentDidMount() {    /**     * This function is the same as before     */    }
  handleInputChange = e => {    /**     * This function is the same as before     */    }
  inputNode = () => {    /**     * This function is the same as before     */  }
  dropdownNode = () => {    /**     * This function is responsible for rendering the dropdown.     */    const { data } = this.props
    return (      
    {data.map(record => { return (
  • {record.value}
  • ) })}
) }
render() {    return (      
{this.inputNode()} {this.dropdownNode()}
) }}

Код для раскрывающегося списка присутствует в DropDownnode функция. На основе данные Пропор, поставляемый на наш плагин, мы создаем список Ли предметы и рендеринг в раскрывающемся списке.

Если мы посетим http://localhost: 3000/ Мы увидим раскрывающееся раскрытие вместе с коробкой ввода.

Это все функциональные возможности, которые нам нужны для раскрывающегося списка. Далее мы восстанавливаем наш плагин, чтобы рендер выпадать только тогда, когда любые записи записываются с помощью запроса, который пользователь будет ввести в поле ввода.

Рефакторинг нашего плагина для рендеринга выпадают только тогда, когда любые записи записей с запросом

Это последний шаг нашего процесса развития.

Во-первых, нам нужно добавить пакет с именем fuse.js который является легким нечетким поиском библиотеки. Это поможет нам проверить, если запрос, который типы пользователей в поле ввода совпадают с любыми записями из данные опоры, поставляемый на наш плагин.

Давайте добавим его в наш список зависимостей, используя команду ниже:

yarn add fuse.js

Теперь мы бы ревертируем наш плагин, чтобы проверить, если запрос соответствует любую из записей.

import React, { Component } from 'react'import PropTypes from 'prop-types'import Fuse from 'fuse.js'
import styles from './styles.css'
export default class ReactSearchBox extends Component {  static propTypes = {    /**     * This is same as before     */  }
  static defaultProps = {    /**     * This is same as before     */  }
  state = {    /**     * 'matchedRecords' stores the items when the input box's value     * matches with any item from the 'data' prop.     */    value: '',    matchedRecords: []  }
  constructor(props) {    super(props)
    const { data } = props
    /**     * These options are from Fuse plugin. Check out http://fusejs.io/     * for more details.     */    const options = {      /**       * At what point does the match algorithm give up. A threshold of 0.0       * requires a perfect match (of both letters and location), a threshold       * of 1.0 would match anything.       */      threshold: 0.05,      /**       * Determines approximately where in the text is the pattern expected to be found.       */      location: 0,      /**       * Determines how close the match must be to the fuzzy location       * (specified by location). An exact letter match which is distance       * characters away from the fuzzy location would score as a complete       * mismatch. A distance of 0 requires the match be at the exact       * location specified, a distance of 1000 would require a perfect       * match to be within 800 characters of the location to be found       * using a threshold of 0.8.       */      distance: 100,      /**       * When set to include matches, only the matches whose length exceeds this       * value will be returned. (For instance, if you want to ignore single       * character index returns, set to 2).       */      minMatchCharLength: 1,      /**       * List of properties that will be searched. This supports nested properties,       * weighted search, searching in arrays of strings and objects.       */      keys: ['value']    }
    this.fuse = new Fuse(data, options)  }
  componentDidMount() {    const { value } = this.props
    /**     * If any 'value' is passed as prop, find if it matches with any item     * from teh 'data' prop. If there is any record, which matches with     * the query, update 'matchedRecord' state with the matched object(s).     *     * Also, update the 'value' state with the 'value' prop.     */    const matchedRecords = this.fuse.search(value)
    this.setState({      value: value.trim(),      matchedRecords,      /**       * Control the showing and hiding of the dropdown when there is any value       * in the input box. But, close the dropdown once any dropdown item is       * clicked.       */      showDropdown: !!value.trim()    })  }
  handleInputChange = e => {    /**     * This function is responsible for checking if any items from the input     * box's value matches with any item form the 'data' prop. If any item matches,     * then that matched object is pushed into the 'matchedRecords' state. That     * state is responsible for populating the dropdown.     */
    const { value } = e.target
/**     * Check all the values from 'data' array whose 'value' matches with     * 'value' using Fuse plugin.     */    const matchedRecords = this.fuse.search(value)
/**     * Update 'value' state with the value from the input box     * Update 'matchedRecords' state with the matched records from the data array.     */    this.setState({      value: value.trim(),      matchedRecords,      /**       * Show the dropdown onChange of the input       */      showDropdown: true    })  }
  inputNode = () => {    /**     * This function is the same as before     */  }
  handleDropdownItemClick = record => {    /**     * This function is responsible for updating the value inside the     * input box when any dropdown item is clicked.     *     * The 'value' state is updated with the clicked record's value.     */
  const { value } = record
  this.setState({      value,      /**       * Hide the dropdown once any dropdown item is clicked       */      showDropdown: false    })  }
  dropdownNode = () => {    /**     * This function is responsible for rendering the dropdown.     * When any value from the input box matches with any value from the     * 'data' prop, that matched object from the 'data' array shows up     * in the dropdown's li. The matched values are stored in the     * 'matchedRecords' state.     */    const { matchedRecords, showDropdown } = this.state
/**     * If there is no value present in the input box, then the dropdown     * shouldn't appear.     */    if (!showDropdown) return false
  return (      
    {matchedRecords.map(record => { return (
  • this.handleDropdownItemClick(record)} > {record.value}
  • ) })}
) }
  render() {    /**     * This function is the same as before     */  }}

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

  1. Типы пользователей в поле ввода (мы бы назвали текст, в котором пользователь в виде Query ).
  2. Onchange Из окна ввода плагин проверит, будет ли текущее значение коробки ввода с любой записью, поставляемой на наш плагин через данные пропры
  3. Если какие-либо записи совпадают с запросом, мы сделаем раскрывающийся список со списком сопоставленных записей.
  4. Если никаких записей не совпадает с запросом, мы не сделаем раскрывающуюся.

Если вы посетите http://localhost: 3000 , вы можете увидеть, что выпадающий список появляется со списком сопоставленных записей. Раскрывающийся список будет скрываться, если входное поле пусто.

Это все код, который нам нужен. Далее мы будем толкать наши изменения в Github Репозиторий.

Толкая наш код в github

В этом разделе мы создадим репозиторий GitHub и подтолкните наш код в Github.

Если вы новичок в GitHub, вы можете следовать за этим Статья знать, как создать репозиторий. Как только вы закончите создать новый репозиторий, вам нужно Добавьте пульт в свой плагин Отказ

git remote add origin https://github.com/ghoshnirmalya/react-search-box

В моем случае я добавляю https://github.com/ghoshnirmalya/react-search-box Потому что я хочу, чтобы мой код меняется, чтобы быть доступным на этом репозитории. Для вашего дела это будет другой URL.

Как только это сделано, вы можете протолкнуть ваши изменения в репозиторий GitHub:

git push origin master

Вы код теперь доступен на вашем репозитории GitHUB.

Публикация нашего плагина до NPM

В этом разделе мы опубликуем наш код в NPM Отказ NPM – менеджер пакета для JavaScript.

Create-ractive-библиотека Уже есть особенность Через который мы можем публиковать наш плагин в реестр NPM. Вам просто нужно запустить следующую команду:

yarn publish

Развертывание примера приложения на страницы GitHub

В этом разделе мы разверним приложение для образца, которое будет использовать наш плагин к Страницы GitHub Отказ

Create-ractive-библиотека Уже есть особенность через который мы можем развернуть Пример папки на страницы GitHub. Вам просто нужно запустить следующую команду:

yarn deploy

Теперь вы можете просмотреть ваше приложение доступно в https://your-username.github.io/your-repository-name/ Отказ Для меня это https://ghoshnirmalya.github.io/react-search-box С момента моего репозитория URL это https://github.com/ghoshnirmalya/react-search-box Отказ

Закрытие заметок

Последнее, что вы должны помнить, так это то, что я сделал кучу изменений в React Search Box на вершине изменений, которые я упомянул здесь. Я просто хотел создать простой AutoComplete React Plugin и думал, что мои учащиеся помогут другим, которые хотят внести свой вклад в реагирование, но не уверены, как начать.

Я надеюсь, что эта статья поможет другим. Мне интересно знать, какие отличные плагины вы, ребята, построите с помощью этих статей. Пожалуйста, дайте мне знать в комментариях ниже.