【问题标题】:Passing Data to Another Component OnClick将数据传递给另一个组件 OnClick
【发布时间】:2019-09-29 12:48:26
【问题描述】:

所以,在路由和管理我的数据时,我遇到了一些问题。

Listing 组件本质上是一大堆包含电影数据的卡片,我从我的要点中获取这些数据。我使用.map 为每张卡片创建了一个组件,并将值添加到道具中。

我的目标:当我点击任何卡片的按钮时,我想转到一个页面并动态访问该电影卡片的名称。

例如:: 假设我单击一个按钮,上面写着一张特定电影卡的“更多信息”。我被路由到 MoreInformation 页面,因为该按钮将包含在 Link 中。

在 MoreInformation 页面/组件中我想动态添加:

<h1>{name}</h1>

这只是我想要完成的一个基本示例,但换句话说,我如何将特定电影卡的数据传输到 MoreInformation 页面,以便我可以访问它以添加动态数据。

如果我能得到反馈,我将非常感激,因为这个项目对时间很敏感......谢谢大家。

const MoviesPage = () => {
  const [movies, setMovies] = useState([])

  useEffect(() => {
    axios
      .get(
        `https://gist.githubusercontent.com/ernestosotelo/9932c659b460e5ddeec8a8ae76164a0d/raw/ce8d7b248f61e73bf3c767538728505d6bac9835/json`
      )
      .then(res => {
        const data = res.data
        setMovies(data)
      })
  }, [])

  return (
    <Layout>
      <div style={{ background: "hsl(215, 100%, 3%" }}>
        <TopThree />

        <p style={{ color: "#e0dfe2", fontSize: "1.7rem", marginTop: "3rem" }}>
          <b
            style={{
              padding: ".5rem 1.5rem .5rem 1.5rem",
              background: "#f9ba00",
              fontSize: "2rem",
              marginLeft: "4rem",
              color: "black"
            }}
          >
            !
          </b>{" "}
          Click 'Remove' to remove movies you definitely will not watch! There
          is an undo option.
        </p>

        <div className={listingCSS.block}>
          {movies.map(movie => {
            return (
              <Listing
                key={movie.name}
                name={movie.name}
                plot={movie.plot}
                date={movie.releaseDate}
                genre={movie.genre}
                imdbRating={movie.imdbRating ? movie.imdbRating : "N/A"}
                tomatoRating={movie.tomatoRating ? movie.tomatoRating : "N/A"}
                metaRating={movie.metaRating ? movie.metaRating : "N/A"}
                erbertRating={movie.erbertRating ? movie.erbertRating : "N/A"}
                tmdbRating={movie.tmdbRating ? movie.tmdbRating : "N/A"}
                movshoRating={movie.movshoRating}
                streamOn={movie.streamOn}
                poster={movie.poster}
                alt={movie.name}
              />
            )
          })}
        </div>
      </div>
    </Layout>
  )
}

【问题讨论】:

  • 您可以为每部电影添加唯一标识符,并通过 URL 将该标识符传递给其他页面。在另一页上,只需从服务器或某种内存/本地存储中检索相应电影的详细信息。
  • 我认为另一篇文章是对其工作方式的补充。 stackoverflow.com/questions/55219775/…

标签: javascript reactjs react-router react-hooks


【解决方案1】:

您可以使用带有 HTML 5 元素的 JS 将数据存储在会话 (sessionStorage.getItem() and sessionStorage.setItem()) 或本地 (localStorage.getItem() and localStorage.setItem()) 上。

如果您更喜欢通过变量将数据存储在 setItem 上:

var session_data = sessionStorage.myValue //For session only
var local_data = localStorage.myValue //For local

sessionStorage.myValue = 'value' //For session only
localStorage.myValue = 'value' //For local

还请记住:要存储 JavaScript 对象,您应该设置并将它们更改为字符串值:

sessionStorage.myObject = JSON.stringify(myObject); // Setting the object to a string

并在使用getItem时将其解析回对象以检索数据:

var myObject = JSON.parse(sessionStorage.myObject); // Parsing JSON back from string to object

还:您可以使用window.name 来存储信息,但请注意,它仅在使用相同的窗口/选项卡时才有效,因此请确保您的按钮或链接具有target 值设置为_self

您可以阅读有关使用 JavaScript HERE 存储不带 cookie 的数据的信息

有关 Web Storage API 的信息:https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API

有关 PersistJS 的信息(您可能会感兴趣):https://github.com/jeremydurham/persist-js

【讨论】:

  • 谢谢,我考虑过 localStorage 方法,但我知道这不是我的场景的最佳用例,而且它使架构变得比现在更复杂,因为我仍在寻找我的方式反应。
【解决方案2】:

您需要创建一个路由来显示传递的数据。例如

<Route path="/movieInfo/:name" exact component={MoreInformation} />

在您的列表中创建指向更多信息组件的链接

<Link to={`/movieInfo/${this.props.name}`}>More info</Link>

在您的 MoreInformation 组件中访问 prop 就像

const { name } = this.props;

Simple Demo here

如果您使用的是功能组件,则可以检索该值,如下所示。内部匹配参数。

function MoreInformation(props) {

  const name = props.match.params.name;

  return <h1>{name}</h1>;
}

【讨论】:

  • 感谢您的尝试。不幸的是,那没有用。我收到“无法读取未定义的属性 'props'”。我也没有使用基于类的组件,只使用功能组件。您的代码架构肯定与我的不同。我已经能够通过链接传递电影名称,因为 URL 肯定会显示我点击的电影,但我无法使用您的推荐访问新页面上的数据。
  • 你能分享你的组件吗
  • 查看我的更新答案,了解如何访问功能属性中的值。
  • 你做到了!我什至不必发布我糟糕的 React 架构。我仍在学习如何使用 React,所以我很感激。非常感谢,我永远感激不尽。如果你有时间,你能像我 5 岁一样解释一下 props.match.params.name 在这种情况下是如何为我工作的吗?
  • 请阅读本教程tylermcginnis.com/react-router-pass-props-to-link将帮助您了解更多。使用函数组件,您可以使用 props.value 访问值,但使用 Link 时,您需要从匹配对象中获取值。
猜你喜欢
  • 2017-06-10
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多