gpt4 book ai didi

javascript - onClick 对子
  • 使用react
  • 转载 作者:太空宇宙 更新时间:2023-11-04 15:48:43 25 4
    gpt4 key购买 nike

    我想添加子类别并在列表上使用react,但是当我单击子类别时,我有两个事件:第一个在子类别上,第二个在父类别上。

    我怎样才能只有子类别?

    这是我的实际代码:

    getList(myList){
    return myList.map((item) => {
    let subList = '';
    if (item.hasSub){
    subList = (<ul>{this.getList(item.sub)}</ul>)
    }
    return (
    <li onClick={() => {this.props.clicHandler(item.id)}}>{item.title}<div>{subList}</div></li>);
    })
    }

    我正在使用递归方法来创建我的列表。我的实际数组是这样的:

    this.list.push({id: 1, title:'coucou' , hasSub: false});
    this.list.push({id: 2, title:'toto' , hasSub: false});
    this.list.push({id: 3, title: 'cat', sub: [{id:4, title:'titi' , hasSub: false}, {id:5, title:'tutu' , hasSub: false}] , hasSub: true});

    感谢您的帮助!

    最佳答案

    问题是 click events "bubble" up到父元素。解决办法是调用 Event.prototype.stopPropagation 就在上面。

    在下面的代码片段中,我添加了 clickHandler组件的方法,并在 getList 中我通过了事件( evt )和 item.id到它。在该方法中我调用 evt.stopPropagation()在调用this.props.clickHandler之前。但是,您也可以在父组件的 clickHandler 中执行此操作方法,或在getList内。选择最适合您的用例的内容。

    class App extends React.Component {
    constructor() {
    super();
    this.clickHandler = this.clickHandler.bind(this);
    }

    render() {
    return <ul>{this.getList(this.props.items)}</ul>;
    }

    getList(list) {
    return list.map((item) => {
    const subList = item.hasSub && (<ul>{this.getList(item.sub)}</ul>);
    return (
    <li key={item.id} onClick={evt => {this.clickHandler(evt, item.id)}}>{item.title}<div>{subList}</div></li>
    );
    });
    }

    clickHandler(evt, itemId) {
    // Stop event propagatation before calling handler passed in props
    evt.stopPropagation();
    this.props.clickHandler(itemId);
    }
    }

    const data = [
    { id: 'a', title: 'A', hasSub: false },
    { id: 'b', title: 'B', hasSub: true, sub: [
    { id: 'b1', title: 'B1', hasSub: true, sub: [
    { id: 'b1a', title: 'B1a', hasSub: false },
    ] },
    { id: 'b2', title: 'B2', hasSub: false },
    ] },
    { id: 'c', title: 'C', hasSub: true, sub: [
    { id: 'c1', title: 'C1', hasSub: false },
    { id: 'c2', title: 'C2', hasSub: false },
    ] },
    ];

    function clickHandler(itemId) {
    console.log('clicked item', itemId);
    }

    ReactDOM.render(<App items={data} clickHandler={clickHandler}/>, document.querySelector('div'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
    <div></div>

    附注您的代码非常出色,但是我可以推荐一种更“ react 方式”来呈现嵌套项目吗?

    您的组件是什么 render方法的作用是调用 getItems函数又递归地调用自身。但是,如果您还记得大多数 React 组件本身都可以被视为函数,那么您可以重构您的代码,以便您的 render方法改为呈现 <Items>递归渲染自身实例的组件。

    这种方法往往会产生更小的功能组件,这些组件更可重用且更易于测试。看看下面的代码片段。

    const Items = ({items, onClick}) => (
    <ul>
    {items.map(item => (
    <li key={item.id} onClick={evt => onClick(evt, item.id)}>
    {item.title}
    {item.hasSub && <Items items={item.sub} onClick={onClick}/>}
    </li>
    ))}
    </ul>
    );

    const data = [
    { id: 'a', title: 'A', hasSub: false },
    { id: 'b', title: 'B', hasSub: true, sub: [
    { id: 'b1', title: 'B1', hasSub: true, sub: [
    { id: 'b1a', title: 'B1a', hasSub: false },
    ] },
    ] },
    ];

    function clickHandler(evt, itemId) {
    evt.stopPropagation();
    console.log('clicked item', itemId);
    }

    ReactDOM.render(<Items items={data} onClick={clickHandler}/>, document.querySelector('div'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>
    <div></div>

    关于javascript - onClick 对子 <li> 使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43327174/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com