如何在 ReactJS 中将数据发送到另一个页面

Posted

技术标签:

【中文标题】如何在 ReactJS 中将数据发送到另一个页面【英文标题】:How to send data to another page in ReactJS 【发布时间】:2020-11-12 21:54:21 【问题描述】:

这里我在 ReactJS 中有一个问题,在 NewCases.jsx 的 POST fetch 部分。那里会生成数据,即app_uid,然后我想将app_uid数据从NewCases.jsx发送到DNNewCases.jsx,但我不知道怎么做。 这是完整的脚本:

NewCases.jsx

import React,  Component, Fragment  from 'react';
import './NewCases.css'
import user2 from '../../images/user2.png';
import  BrowserRouter as Router, Route, Link  from 'react-router-dom';
import DNNewCases from '../DynaformCases/DNNewCases';


class NewCases extends Component 

    constructor(props) 
        super(props)
        this.state = 
            token: sessionStorage.getItem("access_token"),
            username: sessionStorage.getItem("username"),
            user_role: '',
            allcases: [],
            inMemoryCases: [],
            showProcess: [],
            dataSess: [],
            app_uid: '',
            dataselanjutnya: '',
            search: '',
        
        this.getDetailCase = this.getDetailCase.bind(this);
        this.searchData = this.searchData.bind(this);
    

    componentDidMount() 
        if (window.sessionStorage.getItem("access_token") === null) 
            this.props.history.push('/');
        

        fetch('https://bpm.*************.or.id/api/1.0/************/extrarest/session-id', 
            method: 'GET',
            headers: 
                'Content-Type': 'application/json',
                'Accept-Encoding': 'gzip, deflate',
                'Authorization': 'Bearer ' + this.state.token,
            ,
        ).then((response) => response.json())
            .then((responseJson) => 
                console.log(responseJson);
                this.setState(
                    dataSess: responseJson,
                );
            );


        fetch("https://bpm.***********.or.id/api/1.0/***********/extrarest/login-user", 
            method: 'GET',
            headers: 
                'Content-Type': 'application/json',
                'Accept-Encoding': 'gzip, deflate',
                'Authorization': 'Bearer ' + this.state.token,
            
        ).then(result => result.json()).then(resultJSON => 
            this.getUserRole(resultJSON.uid);
        )
        fetch('https://bpm.**************.or.id/api/1.0/************/case/start-cases', 
            method: 'GET',
            headers: 
                'Content-Type': 'application/json',
                'Accept-Encoding': 'gzip, deflate',
                'Authorization': 'Bearer ' + this.state.token,
            ,
        ).then((response) => response.json())
            .then((responseJson) => 
                console.log(responseJson[0]);
                this.setState(
                    allcases: responseJson,
                    inMemoryCases: responseJson,
                );
            );
    

    getUserRole = (uid) => 
        fetch("https://bpm.***********.or.id/api/1.0/************/user/" + uid, 
            method: 'GET',
            headers: 
                'Content-Type': 'application/json',
                'Accept-Encoding': 'gzip, deflate',
                'Authorization': 'Bearer ' + this.state.token,
            
        ).then(result => result.json()).then(resultJSON => 
            if (resultJSON.usr_role == "PROCESSMAKER_ADMIN") 
                this.setState( user_role: 'Administrator' )
             else if (resultJSON.usr_role == "PROCESSMAKER_OPERATOR") 
                this.setState( user_role: 'Operator' )
             else if (resultJSON.usr_role == "PROCESSMAKER_MANAGER") 
                this.setState( user_role: 'Manager' )
            
        )
    

    getDetailCase(pro, tas) 
        fetch("https://bpm.***************.or.id/api/1.0/************/cases/", 
            method: 'POST',
            headers: 
                'Content-Type': 'application/json',
                'Accept-Encoding': 'gzip, deflate',
                'Authorization': 'Bearer ' + this.state.token,
            ,
            body: JSON.stringify(
                'pro_uid': pro,
                'tas_uid': tas,
            ),
        ).then((response) => response.json())
            .then((responseJson) => 
                this.setState(
                    showProcess: responseJson,
                );
                this.state.app_uid = (this.state.showProcess.app_uid);
            );
    


    searchData = (event) => 
        this.setState( search: event.target.value )
        const searchData = this.state.inMemoryCases.filter(
            data => 
                let lowerCase = (data.pro_title).toLowerCase()
                let searchLowerCase = this.state.search.toLowerCase()

                return lowerCase.indexOf(searchLowerCase) > -1;
            
        );
        this.setState( allcases: searchData );
    


    render() 
        return (

            <Fragment>
                <div className="background-nya">
                    <div className="header">
                        <Link style= textDecoration: 'none'  to="/menu">
                            <p className="headerLabel-fix"> ********** </p>
                        </Link>
                        <p className="headerLabelUser"> this.state.username </p>
                        <p className="headerLabelPass"> this.state.user_role </p>
                        <img className="userIcon" src=user2 />
                    </div>
                    <p className="titlePage"> PROCESS LIST </p>
                    <div className="form-search">
                        <input type="text" value=this.state.search onChange=this.searchData placeholder="search"></input>
                    </div>
                    <br />
                    
                        this.state.allcases.map((process) => 
                             this.getDetailCase(process.pro_uid, process.tas_uid) 
                            return (
                                <Fragment>
                                    <Link
                                        to=
                                            pathname: "/dynaform",
                                            state: this.state.app_uid
                                        
                                    >
                                        <div key=process.pro_uid className="caseList" onClick=this.alertShow>
                                            process.pro_title
                                        </div>
                                    </Link>
                                </Fragment>
                            )
                        )
                    
                </div>

            </Fragment>
        )
    


export default NewCases; 

DNNewCases.jsx

import React,  Component, Fragment  from 'react';
import user2 from '../../images/user2.png';
import  BrowserRouter as Router, Route, Link  from 'react-router-dom';
import Iframe from 'react-iframe'


class DNNewCases extends Component 

    
    constructor(props) 
        super(props)
        this.state = 
            username: sessionStorage.getItem("username"),
            token: sessionStorage.getItem("access_token"),
            dataSess: [],

        
    

    componentDidMount() 
        if (window.sessionStorage.getItem("access_token") === null) 
            this.props.history.push('/');
        

        fetch('https://bpm.**********.or.id/api/1.0/**********/extrarest/session-id', 
            method: 'GET',
            headers: 
                'Content-Type': 'application/json',
                'Accept-Encoding': 'gzip, deflate',
                'Authorization': 'Bearer ' + this.state.token,
            ,
        ).then((response) => response.json())
            .then((responseJson) => 
                console.log(responseJson);
                this.setState(
                    dataSess: responseJson,
                );
            );
    
    
    render() 

        return (
        <Iframe url= 'https://bpm.************.or.id/***********/en/neoclassic/cases/open?APP_UID=&DEL_INDEX=1&action=EDIT&sid=' + this.state.dataSess
            
            
            display="block"
            position="fixed" />
        )
    
    


export default DNNewCases;

希望我能在这里找到解决方案。非常感谢

【问题讨论】:

this.state.app_uid = (this.state.showProcess.app_uid); - 你正在直接改变你的状态。我建议在setState 中设置这个新的 app_uid 【参考方案1】:

我建议使用“react-redux”。

使用mapDispatchToProps 和一些操作,您可以将新数据保存在reducer 中,然后您可以使用mapStateToProps 访问数据。

上面的链接提供了一些示例,我个人推荐来自techsith 的 youtube 教程。

【讨论】:

【参考方案2】:

您可以在组件之间导航时使用道具,

看看this,在路由器链接之间传递数据

如果没有更好的解决方案,请尝试使用Redux。

youtube教程点击here

【讨论】:

【参考方案3】:

我建议使用withRouter

export default withRouter(props => <NewCases ...props />);

来自 ReactTraining 文档:

您可以访问历史对象的属性和最近的 的匹配通过 withRouter 高阶组件。带路由器 将更新的匹配、位置和历史道具传递给包装的 组件无论何时呈现。

一旦您可以访问您的history,请使用此 sn-p 重新路由:

this.props.history.push(`/someRoute`);

在您的 API 调用之后以及将正确的状态设置为 app_uid 之后,只需在您的 setState 回调中调用此 sn-p。正如我在评论中所说,您似乎正在直接改变您的状态。我强烈建议在setState 函数中设置新的app_uid

附带说明:我没有看到您的 Route 配置。此答案假定您至少已在原始代码库上设置了客户端路由。

【讨论】:

以上是关于如何在 ReactJS 中将数据发送到另一个页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中将图像从一个活动发送到另一个活动?

在php中将最后一个id插入变量发送到另一个页面[重复]

如何在 C++ 中将字节数组发送到另一个进程

ReactJS:如何以编程方式将用户重定向到另一个页面?

如何在提交函数的reactjs中将表单值作为FormData传递

如何在android中将图像从一个活动发送到另一个活动