当前位置: 首页 > 知识库问答 >
问题:

如何在React/Typescript中定义历史记录和匹配类型(来自React路由器Dom)

丁鹏鹍
2023-03-14

我有一个使用React,React路由器Dom(RRD),Redux和Typecript的项目。默认情况下,RRD将匹配历史道具传递给我在路由组件道具中定义的子组件(见下文)。在我的组件中,Redux还向我的组件添加了两个道具,一个函数(getPlaylist)和一个对象(auth)。

在我的组件中,当我输入所有道具时,我在输入matchhistory时遇到问题。

我尝试了以下方法,但没有成功:

  • 添加了自定义道具的RouteComponent道具

我的组件

import React, { useEffect, useState, useMemo, useLayoutEffect } from "react"
import { connect } from "react-redux"
import PropTypes from "prop-types"
import CreatePlaylist from "../components/playlist/CreatePlaylist"
import { getPlaylist } from "../actions/playlistActions"
import isEmpty from "../utils/isEmpty"
import { Auth, Playlist } from "interfaces"
import { RouteComponentProps } from "react-router"
import { History } from "react-router-dom"

type EditPlaystProps2 = {
    getPlaylist: Function
    playlist: Playlist
    auth: Auth
}

interface EditPlaystProps {
    history: History
    auth: Auth
    getPlaylist: Function
    playlist: Playlist
    match: any
}

function EditPlaylist({
    history,
    auth,
    getPlaylist,
    playlist,
    match,
}: RouteComponentProps<EditPlaystProps2>) {
const [currentPlaylist, setcurrentPlaylist] = useState({})

    useEffect(() => {
        const { isAuthenticated } = auth

        if (!isAuthenticated) {
            history.push("/login")
        }
    }, [auth, history])

    useLayoutEffect(() => {
        getPlaylist(match.params.slug)
    }, [getPlaylist, match.params.slug])

    useMemo(() => {
        const { isAuthenticated } = auth

        if (!isAuthenticated) {
            history.push("/login")
        }
        if (playlist) {
            setcurrentPlaylist(playlist)
        }
    }, [auth, history, setcurrentPlaylist, playlist])

    const editQupplistContent = () => {
        const playlistsHaveLoaded = !isEmpty(currentPlaylist.playlist)

        if (playlistsHaveLoaded) {
            return (
                <CreatePlaylist
                    name={currentPlaylist.playlist.name}
                    slug={currentPlaylist.playlist.slug}
                    id={currentPlaylist.playlist._id}
                    title="Edit playlist"
                    buttonText="Edit playlist"
                />
            )
        }
    }

    return (
        <div>
            <h1>Edit playlist</h1>

            {editQupplistContent()}
        </div>
    )
}

EditPlaylist.propTypes = {
    getPlaylist: PropTypes.func.isRequired,
    playlist: PropTypes.object,
    auth: PropTypes.object.isRequired,
}

const mapStateToProps = (state) => ({
    auth: state.auth,
    playlist: state.playlist,
})

export default connect(mapStateToProps, { getPlaylist })(EditPlaylist)

共有1个答案

闾丘博超
2023-03-14
type Props = RouteComponentProps & {
  getPlaylist: Function,
  playlist: Playlist,
  auth: Auth,
}

这样地?

 类似资料:
  • 我在从React路由器v3迁移到v4时遇到了一些小问题。在v3中,我可以在任何地方执行此操作: 如何在v4中实现这一点。 我知道,当您在组件中时,我可以使用hoc、react context或event router道具。但我不是这样。 我正在寻找v4中组件的外部导航的等价性

  • 在我的项目中,我使用React路由器DOM 5.2.0。我必须使用

  • 我是react with typescript的初学者,在下面的代码中面临问题 下面是仪表板组件的代码 这是路线代码 在路线代码中,我面临类型问题,即。 E:/Web/src/router/route中的TypeScript错误。tsx(18,51): 没有重载匹配此调用。 重载1 of 2,'(props: ReadOnly): Road',给出以下错误。键入{Dashboard: string

  • 是否可以创建一个全局历史文件来管理react-router-dom v5上的createBrowser历史()?我知道V5有使用历史()作为获取历史的一种方式。但是有没有可能从任何地方检索历史记录,比如我没有使用函数组件的情况? 在V4上,我可以创建一个文件history.js: 它在V4上工作https://codesandbox.io/s/react-router-v4-nfwr0 它在V5上

  • 单击任何NavLink或Link后,它总是打开PageNotFound组件。

  • 问题内容: 谁能告诉我如何返回上一页而不是特定路线? 使用此代码时: 收到 此错误, 因为没有路由器历史记录 , 所以goBack()被忽略了 这是我的路线: 问题答案: 我想你只需要通过intializing它就像你的路由器上启用BrowserHistory: 。 在此之前,您应该需要从 希望对您有所帮助! UPDATE:ES6中的示例