Автор оригинала: 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 */ }}
Я добавил комментарии внутри каждой функции, которая определяет то, что делает эту конкретную функцию. Основные функциональные возможности, которые мы выходите из вышеуказанного кода, следующие:
- Типы пользователей в поле ввода (мы бы назвали текст, в котором пользователь в виде
Query
). Onchange
Из окна ввода плагин проверит, будет ли текущее значение коробки ввода с любой записью, поставляемой на наш плагин черезданные
пропры- Если какие-либо записи совпадают с запросом, мы сделаем раскрывающийся список со списком сопоставленных записей.
- Если никаких записей не совпадает с запросом, мы не сделаем раскрывающуюся.
Если вы посетите 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 и думал, что мои учащиеся помогут другим, которые хотят внести свой вклад в реагирование, но не уверены, как начать.
Я надеюсь, что эта статья поможет другим. Мне интересно знать, какие отличные плагины вы, ребята, построите с помощью этих статей. Пожалуйста, дайте мне знать в комментариях ниже.