前提・実現したいこと
React.js Javascriptの初心者です。
検索した文字をフィルターファンクションで、配列関数とマッチするもを、フィルタリングさせたいと思っています。
別のコンポーネントにある、配列から、name
と、inputからゲットしたvalue
がマッチする場合に、そのマッチするコンポーネントを呼び出す、ファンクションを作りたいと思っております。
しかし、Uncaught TypeError: filter.match is not a function
のエラーが発生し、原因がわからずに途方に暮れています。
return filter.match(elem.name)
の部分が何か間違えているのか、タイプミスではないと思うのですが、何が原因なのか教えていただけませんでしょうか。よろしくお願いいたします。
発生している問題・エラーメッセージ
Uncaught TypeError: filter.match is not a function
該当のソースコード
import React, { Component } from 'react'; import { render } from 'react-dom'; import StyleguideModal from './StyleguideModal'; /* Styleguide Application */ class Search extends React.Component { constructor(props) { super(props); this.state = { textLists: props.textLists, search:"", elements:[] }; } handleSearch(e) { var filter = new RegExp(e.target.value); var newState = {}; newState.search = e.target.value; newState.elements = this.props.textLists.filter(function(elem) { return filter.match(elem.name) }); this.setState(newState); } componentDidMount() { $(document).foundation(); } renderItem(text) { return ( <div className="margin-bottom-4 small-6 medium-4 large-2 columns card-wrap"> <a className="itemLink" data-open="Style-Modal"> <div className="radius bordered shadow card"> <img className="style-tmb-s" src={text.thumbnail} /> <div className="card-section"> <p>{text.name}</p> </div> </div> </a> </div> ) } renderImges(text) { return ( <div> <img src={text.image} /> </div> ) } render() { return ( <div className="wrap"> <SearchFilter options={this.props.textLists.map(function(elem) { return elem.name } ) } search={this.state.search} onChange={this.handleSearch.bind(this)} /> <div className="main-wrap"> <div className="result-wrap"> <div className="large-12.columns"> <div className="small-9 large-10 columns padding-top-3 result-wrap"> <StyleguideOverlay textLists={this.props.textLists} /> <div className="row"> <div className="margin-bottom-1 small-12 medium-12 large-12 columns title-wrap"> <i className="fi-magnifying-glass"></i> <h3 className="title">Icons</h3> </div> </div> <div className="row items-wrap"> { this.state.elements.map(function(elem) { return this.renderImages(elem) }) } { this.state.elements.map(function(elem) { return this.renderItems(elem) }) } </div> </div> </div> </div> </div> </div> ); } } class StyleguideOverlay extends React.Component { renderText(text) { return ( <div> <div className="tabs-panel is-active" id="panel1"> <pre> <code> {text.sourceTypeA} </code> </pre> </div> <div className="tabs-panel" id="panel2"> <pre> <code> {text.sourceTypeB} </code> </pre> </div> </div> ) } render() { return ( <div className="reveal row" id="Style-Modal" data-reveal> <div className="Style-Modal-inner columns small-12"> <ul className="tabs" data-tabs id="example-tabs"> <li className="tabs-title is-active"> <a href="#panel1" aria-selected="true">HTML</a></li> <li className="tabs-title"><a data-tabs-target="panel2" href="#panel2">source B</a></li> </ul> <div className="tabs-content" data-tabs-content="example-tabs"> {this.props.textLists.map(this.renderText)} </div> <button className="close-button" data-close aria-label="Close modal" type="button"> </button> </div> </div> ) } } class SearchFilter extends React.Component { render() { return ( <div className="large-12.columns header"> <div className="row head-nav" id="responsive-menu"> <div className="small-7 large-7 columns search-rap"> <div className="small-12 large-12 columns" id="header"> <div className="input-group search-from-wrap"> <input type="text" className="padding-lest-3 form-control _keyword border-radius-s" onChange={this.props.onChange} value={this.props.search} name="search" placeholder="what are you searching?" autoComplete="on" list="stylesuggest" /> <datalist id="stylesuggest"> { this.props.options.map(function(option) { return (<option value={option} />) }) } </datalist> <div className="search-icon-rap" > <i className="fi-magnifying-glass"></i> </div> </div> </div> </div> </div> </div> ) } } export default Search;
constructor(props) { super(props); this.state = { textLists: [ { thumbnail: 'images/styleguide/style-guide-thumbnail-list_icon-add-project.png', name:'Cancel Button', sourceTypeA:'<i class="fi-heart"></i>', sourceTypeB:'sourceB'}, { thumbnail: 'images/styleguide/style-guide-thumbnail-list_icon-already-checked.png', name:'Already checked', sourceTypeA:'<i class="fi-heart"></i>', sourceTypeB:'sourceB'}, { thumbnail: 'images/styleguide/style-guide-thumbnail-list_icon-calendar.png', name:'Calendar', sourceTypeA:'<i class="fi-heart"></i>', sourceTypeB:'sourceB'}, { thumbnail: 'images/styleguide/style-guide-thumbnail-list_icon-cause-effect.png', name:'Cause & effect', sourceTypeA:'<i class="fi-heart"></i>', sourceTypeB:'sourceB'}, ] }; }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/22 08:13
2018/06/22 09:36
2018/06/22 09:43
2018/06/22 09:50 編集
2018/06/22 10:26
2018/06/22 11:14
2018/06/22 22:40