javascript - React toggle 分别阅读每个项目的更多内容

标签 javascript reactjs

使用此代码我可以切换Continue reading Read less,但它适用于所有项目。

如何分别切换列表中的每个项目

CODEPEN

JS

handleReadMoreClick(item_id) {
    console.log(item_id)
    this.setState({ readMore: !this.state.readMore })
}


render(....
  let { readMore } = this.state

    <span key={item.id}>
        <p>{item.title}</p>
        <p>{item.date}</p>
        <p className={readMore ? "read-more" : "read-less"}>{item.text}</p>
        <p onClick={() => { this.handleReadMoreClick(item.id) }}>
            {
                readMore ? 
                <strong>Show less</strong>:
                <strong>Continue reading</strong>
            }
        </p>
    </span>

CSS

    .read-more{
        height: auto;
    }
    .read-less{
        height: 60px;
        overflow: hidden;
    }

最佳答案

问题是您对所有组件都有一个标志。相反,您应该为每个项目设置 1 个标志。

最好的方法是创建一个组件,然后遍历数据并创建组件列表。

class ToggleText extends React.Component {
  constructor (props){
    super(props);
    this.state={
      readMore: false,
    }
  }
  
  handleReadMoreClick() {
    this.setState({ readMore: !this.state.readMore })
  }
  
  render(){
    return (
      <span key={this.props.id}>
        <p>{this.props.title}</p>
        <p className={this.state.readMore ? "read-more" : "read-less"}>{this.props.text}</p>
        <p onClick={() => { this.handleReadMoreClick(this.props.id) }}>
          <b> { this.state.readMore ? 'Show less' : 'Continue reading' }</b> 
        </p>
      </span>
    )
  }
}

const Application = () => {
    let news_and_updates = [{"id": 1,"title": "Update: 1st Year Anniversary","date": "09/15/2016 02:36AM","text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam bibendum erat ut pulvinar tristique. Cras non dui volutpat, imperdiet arcu nec, commodo odio. Fusce sed consequat felis. Cras ut dapibus risus. Phasellus lectus odio, iaculis eu augue et, porttitor ultricies neque. Mauris dapibus ipsum arcu, non commodo ipsum fringilla a. Morbi gravida mi elementum pretium facilisis. Maecenas sit amet dui auctor, malesuada sapien id, ullamcorper tellus. Mauris condimentum posuere eros at commodo. Pellentesque ut tristique sem.","link": "https://www.nutaku.net/games/flower-knight-girl/news-updates/info/879" }, {"id": 2,"title": "Update: 1st Year Anniversary","date": "09/15/2016 02:36AM","text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam bibendum erat ut pulvinar tristique. Cras non dui volutpat, imperdiet arcu nec, commodo odio. Fusce sed consequat felis. Cras ut dapibus risus. Phasellus lectus odio, iaculis eu augue et, porttitor ultricies neque. Mauris dapibus ipsum arcu, non commodo ipsum fringilla a. Morbi gravida mi elementum pretium facilisis. Maecenas sit amet dui auctor, malesuada sapien id, ullamcorper tellus. Mauris condimentum posuere eros at commodo. Pellentesque ut tristique sem.","link": "https://www.nutaku.net/games/flower-knight-girl/news-updates/info/879" }, {"id": 3,"title": "Update: 1st Year Anniversary","date": "09/15/2016 02:36AM","text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam bibendum erat ut pulvinar tristique. Cras non dui volutpat, imperdiet arcu nec, commodo odio. Fusce sed consequat felis. Cras ut dapibus risus. Phasellus lectus odio, iaculis eu augue et, porttitor ultricies neque. Mauris dapibus ipsum arcu, non commodo ipsum fringilla a. Morbi gravida mi elementum pretium facilisis. Maecenas sit amet dui auctor, malesuada sapien id, ullamcorper tellus. Mauris condimentum posuere eros at commodo. Pellentesque ut tristique sem.","link": "https://www.nutaku.net/games/flower-knight-girl/news-updates/info/879" }]
    
    return (
      <div>      
        {
          news_and_updates.map((item) => <ToggleText {...item} /> )
        }
    </div>
    )
}

ReactDOM.render(<Application />, document.getElementById('app'));
.read-more{
  height: auto;
}
.read-less{
  height: 15px;
  overflow: hidden;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></app>

关于javascript - React toggle 分别阅读每个项目的更多内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45957071/

相关文章:

javascript - 用于选择由 CheckBoxFor 生成的所有复选框的复选框

javascript - 使用 JavaScript 创建照片幻灯片

javascript - 在javascript问题中解析日期

javascript - 光线转换到 TextGeometry 的边界框而不是网格

javascript - 任务 :react-native-webview:compileDebugJavaWithJavac FAILED

javascript - 为什么 createStore 有效而 configureStore 无效?

javascript - 我在使用流畅的布局时遇到问题

javascript - 从 PanResponder 内部更新状态

reactjs - React Router v4 - 如何防止重定向循环?

node.js - 尝试在reactjs中使用GET将状态设置为一个值,