Reactjs 使用另一个组件的 onclick 更改 div 中的内容

Reactjs change content in div with onclick from another component

我是新手,遇到了问题。

我有一个组件 (film.js),它有一个对象的地图数组,通过单击每个对象,我想根据单击的元素之一更改 {komponentaFilma}。

我的逻辑可能完全错误,请随时指出正确的方向谢谢。

app.js

      render() {

    let komponentaFilma = null;
    if ( this.state.prikaziFilmCont ) {
      komponentaFilma = (
        <div className="trailer_container">
          <p>Ovo je film koji je kliknut</p>
        </div>
      );
    }


    return (
      <div>
      <div className="movies-container">
        {this.state.filmovi.map((film, index) => {
          return <Film
                    naslov={film.naslov}
                    naslovnaSlika={film.naslovnaSlika}
                    key={film.id}
                    openFilm={() => this.injectFilm(index)}/>
      })}
      </div>
      <Gallery />
      {komponentaFilma}
      </div>
    );
  }

我也在app.js

中使用这个方法
  injectFilm = (filmIndex) => {
    const prikaziFilm = this.state.prikaziFilmCont;
    this.setState({prikaziFilmCont: !prikaziFilm})
  }

这个还有

prikaziFilmCont: false

在州

film.js 看起来像这样

const Film = (props) => {
  return (
      <div onClick={props.openFilm} className="singleMovie">
        <h3>{props.naslov}</h3>
        <img src={props.naslovnaSlika} alt="nova slika "/>
      </div>
  )
}

这是我的状态 app.js 这些对象被点击,我想将这些对象的信息 (onclick) 传递给 komponenta filma。

  state = {
    filmovi: [
      {
        "naslov": "Safarikova",
        "id": "00",
        "naslovFilma": "Safarikova",
        "godina": "Safarikova",
        "opis": "Lorem ipsum dolor sit ....",
        "naslovnaSlika": "http://dusanmuncan.underconstructioncity.com/srdjan_susa/images/safarikova.png",
        "linkVideo": "http://video/video.mp4",
        "externiLink": "http://www.vimeo.com/video.mp4"
      }, {
        "naslov": "Svetski sampion",
        "id": "01",
        "naslovFilma": "Sampion",
        "godina": "Safarikova",
        "opis": "Cupcake ipsum color sit pinaple juice ....",
        "naslovnaSlika": "http://dusanmuncan.underconstructioncity.com/srdjan_susa/images/trailer_prvaksveta.png",
        "linkVideo": "http://video/videosampoion.mp4",
        "externiLink": "http://www.vimeo.com/videosampion.mp4"
      }, {
        "naslov": "Stolice",
        "id": "02",
        "naslovFilma": "stolicice malene",
        "godina": "stolice ",
        "opis": "sede ljudi na stolicama i na kraju ustanu",
        "naslovnaSlika": "http://dusanmuncan.underconstructioncity.com/srdjan_susa/images/trailer_stolice.png",
        "linkVideo": "http://video/stolice.mp4",
        "externiLink": "http://www.vimeo.com/sto_lice.mp4"
      }
    ],
    prikaziFilmCont: false
  }

如果您需要我提供更多信息,请写信给我。

您可以在您所在的州添加selectedFilm 属性

state: {
  ...... // other properties in state
  selectedFilm: {}
}

您需要找到点击了哪部电影,并在 App 组件的状态中将该电影设置为 selectedFilm。所以改变 injectFilm

injectFilm = (filmIndex) => {
    // const prikaziFilm = this.state.prikaziFilmCont;
    // finding the film clicked 
    const selectedFlim = this.state.filmovi.find((film, index) => index === filmIndex)
    this.setState((prevState) => ({
        // prikaziFilmCont: !prevState.prikaziFilm,
       selectedFlim
    }))    
  }

您可以更新 if 条件并使用 selectedFlim

// checking if "selectedFlim" is empty object or not
// if it is not empty then use "komponentaFilma" as below jsx
// otherwise "komponentaFilma" will be null
let komponentaFilma = null;
if ( Object.keys(this.state.selectedFilm).length > 0 ) {
      komponentaFilma = (
        <div className="trailer_container">
          <p>{this.state.selectedFlim.id}</p>
          <p>{this.state.selectedFlim.naslovFilma}</p>
        </div>
      );
    }

最后你可以在你的 jsx

中使用 komponentaFilma
return (
      <div>
      <div className="movies-container">
        {this.state.filmovi.map((film, index) => {
          return <Film
                    naslov={film.naslov}
                    naslovnaSlika={film.naslovnaSlika}
                    key={film.id}
                    openFilm={() => this.injectFilm(index)}/>
      })}
      </div>
      <Gallery />
      // checking if "selectedFlim" is empty object or not
      // if it is empty then nothing is displayed
      // otherwise "komponentaFilma" will be displayed
      {Object.keys(this.state.selectedFilm).length > 0 && komponentaFilma}
      </div>
    );

注意: 你可以使用 KomponentaFilma 作为组件并传递 selectedFilm 作为 props

例如:

{Object.keys(this.state.selectedFilm).length > 0 && <KomponentaFilma selectedFilm={this.state.selectedFilm />}

KomponentaFilma 组件可以是

const KomponentaFilma = ({selectedFilm}) => {
   return (
     <div>
       <p>{selectedFlim.id}</p>
       <p>{selectedFlim.naslovFilma}</p>
     </div>
   )
}