Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取由映射函数生成的列表项的键?_Javascript_Reactjs - Fatal编程技术网

Javascript 如何获取由映射函数生成的列表项的键?

Javascript 如何获取由映射函数生成的列表项的键?,javascript,reactjs,Javascript,Reactjs,因此,我正在学习React,我尝试在stackoverflow和React自己的文档中寻找问题的解决方案,但我仍然感到困惑 基本上,我有一个10个子Reddits的列表,它以subredditsArray变量的形式映射到列表项 我呈现结果,并在单击该列表项时尝试将所选项传递给我的getSubredditInfo函数。但是,这不起作用-event.target.key未定义。(为了澄清,我希望抓取我单击的单个列表元素的键) 当我尝试只获取event.target时,我得到了实际的htmlEleme

因此,我正在学习React,我尝试在stackoverflow和React自己的文档中寻找问题的解决方案,但我仍然感到困惑

基本上,我有一个10个子Reddits的列表,它以
subredditsArray
变量的形式映射到列表项

我呈现结果,并在单击该列表项时尝试将所选项传递给我的
getSubredditInfo
函数。但是,这不起作用-
event.target.key
未定义。(为了澄清,我希望抓取我单击的单个列表元素的键)

当我尝试只获取
event.target
时,我得到了实际的htmlElement(例如:
  • Dota2
  • ),在这里,我想获取键,或者至少将该值以某种方式放入一个没有标记的字符串中。我还尝试将onClick方法放在map函数的list标记中,但没有成功

    以下是相关代码:

    //this is where I get my data
    componentDidMount(){
        fetch('https://www.reddit.com/api/search_reddit_names.json?query=dota2')
        .then(results => {
            return results.json();
        })
        .then(redditNames => {
            //this is there I set my subreddits state variable to the array of strings
            this.setState({subreddits: redditNames.names});
        })
    }
    
       getSubredditInfo(event){
        //console.log(event.target.key); <-- DOESNT WORK
    
    }
    
    render() {
    
     var subredditsArray = this.state.subreddits.map(function(subreddit){
        return (<li key={subreddit.toString()}>{subreddit}</li>);
    });
    
      return (
        <div className="redditResults">
          <h1>Top 10 subreddits for that topic</h1>
          <ul onClick={this.getSubredditInfo}>{subredditsArray}</ul>
        </div>
      );
    }
    
    //这是我获取数据的地方
    componentDidMount(){
    取('https://www.reddit.com/api/search_reddit_names.json?query=dota2')
    。然后(结果=>{
    返回results.json();
    })
    。然后(redditNames=>{
    //在这里,我将subreddits状态变量设置为字符串数组
    this.setState({subreddits:redditNames.names});
    })
    }
    getSubredditInfo(事件){
    
    //console.log(event.target.key);尝试以下代码:

    类应用程序扩展了React.Component{
    建造师(道具){
    超级(道具);
    this.state={subreddits:[]};
    }
    componentDidMount(){
    取('https://www.reddit.com/api/search_reddit_names.json?query=dota2')
    。然后(结果=>{
    返回results.json();
    })
    。然后(redditNames=>{
    //在这里,我将subreddits状态变量设置为字符串数组
    this.setState({subreddits:redditNames.names});
    })
    }
    getSubredditInfo(subreddit){
    console.log(subreddit);
    }
    render(){
    返回
    该主题的前10个子项
    
      { this.state.subreddits.map((subreddit)=>{ 返回(
    • this.getSubredditInfo(subreddit)}>{subreddit}
    • ); }) }
    ; } } ReactDOM.render( , document.getElementById('容器') );

    你想这样做吗?我不知道你想做什么

    getSubredditInfo(e, subreddit) {
      console.log(subreddit)
    }
    
    render() {
      const { subreddits } = this.state
      var subredditsArray = subreddits.map(subreddit => (
        <li 
          key={subreddit.toString()} 
          onClick={(e) => {
            this.getSubredditInfo(e, subreddit)
          }}
        >
          {subreddit}
        </li>
      ))
    
      return (
        <div className="redditResults">
          <h1>Top 10 subreddits for that topic</h1>
          <ul>{subredditsArray}</ul>
        </div>
      );
    }
    
    getSubredditInfo(e,subreddit){
    console.log(subreddit)
    }
    render(){
    const{subreddits}=this.state
    var subredditsArray=subreddits.map(subreddit=>(
    
  • { this.getSubredditInfo(e,subreddit) }} > {subreddit}
  • )) 返回( 该主题的前10个子项
      {subredditsArray}
    ); }
    关键目的是将子reddit传递给onClick函数,以便在单击该项时接收该值


    如果你仍然出错,试试这个,告诉我发生了什么

    render() {
      const { subreddits } = this.state
      var subredditsArray = subreddits.map(subreddit => (
        <li 
          key={subreddit.toString()} 
          onClick={(e) => {
            console.log(subreddit.toString())
          }}
        >
          {subreddit}
        </li>
      ))
    
      return (
        <div className="redditResults">
          <h1>Top 10 subreddits for that topic</h1>
          <ul>{subredditsArray}</ul>
        </div>
      );
    }
    
    render(){
    const{subreddits}=this.state
    var subredditsArray=subreddits.map(subreddit=>(
    
  • { console.log(subreddit.toString()) }} > {subreddit}
  • )) 返回( 该主题的前10个子项
      {subredditsArray}
    ); }
    您可以使用lamda函数或为具有自己的
    getSubredditInfo
    函数值的项目列表制作组件

    getSubredditInfo(value) {}
    
    render() {
    
      var subredditsArray = this.state
       .subreddits.map((subreddit, i) => 
         (<li key={i} 
              onClick={() => this.getSubredditInfo(subreddit)}>{subreddit}</li>));
    
      return (
        <div className="redditResults">
          <h1>Top 10 subreddits for that topic</h1>
          <ul>{subredditsArray}</ul>
        </div>
      );
    }
    
    getSubredditInfo(值){}
    render(){
    var subredditsArray=this.state
    .subreddits.map((subreddit,i)=>
    (
  • this.getSubredditInfo(subreddit)}>{subreddit}
  • ); 返回( 该主题的前10个子项
      {subredditsArray}
    ); }
    1)键应该由数组中对象的id抓取。或者您可以组合这两个属性来创建一个唯一的键,以便更好地处理重新渲染

    如果您有一个字符串数组,您可以使用字符串值+索引的组合来创建一个唯一的值,尽管不鼓励使用索引

    下面给出了两个方面的快速示例

    2) 更好的方法是将map函数移动到另一个函数中,并在render函数中调用该函数,该函数将返回所需的JSX。它将清理渲染函数

    类应用程序扩展了React.Component{
    建造师(道具){
    超级(道具);
    此.state={
    subredditsObjArray:[
    {id:1,值:'A'},
    {id:2,值:'B'},
    {id:3,值:'C'},
    {id:4,值:'D'}
    ],
    子Reddits数组:['A','B','C','D'],
    selectedValue:“”
    };
    }
    getSubredditInfo=(subreddit)=>{
    console.log(subreddit)
    这是我的国家({
    selectedValue:((subreddit&&subreddit.id)?subreddit.value:subreddit),
    });
    }
    render(){
    返回(
    所选值:{this.state.selectedValue}

    Top{this.state.subredditsaray.length | |“0”}该主题的subreddits 带对象数组

      { 这个.state.subredditsObjArray &&this.state.subredditsObjArray.map(redditObj=>{ 返回(
    • this.getSubredditInfo(redditObj)}>{redditObj.value | |'未找到'}
    • ); }) }

    带字符串数组

      { this.state.subreddits数组 &&this.state.subredditsArray.map((reddit,index)=>{ 返回(
    • this.getSubredditInfo(reddit)}>{reddit | | notfound'}
    • ); }) }
    ); } } ReactDOM.render( , document.getElementById('容器') );