如何在单击反应中的按钮时在新选项卡中打开页面?我也想向该页面发送一些数据

Posted

技术标签:

【中文标题】如何在单击反应中的按钮时在新选项卡中打开页面?我也想向该页面发送一些数据【英文标题】:How to open a page in new tab on click of a button in react? I want to send some data to that page also 【发布时间】:2018-05-04 12:26:02 【问题描述】:

我正在开发发票页面,在该页面中,用户可以通过单击按钮来开具发票,我会调用 api 调用,在得到响应后我想将一些数据发送到 页面(RaisedInvoice.jsx) 应该在 新标签页 中打开,我该怎么做。我没有得到的是如何通过单击 ReactJs 中的按钮在新选项卡中打开页面。

RaiseInvoice.jsx:

import React from 'react';
import Links from './Links.jsx';
import history from './history.jsx';

import axios from 'axios';

class RaiseInvoice extends React.Component 
    
    constructor(props) 
        super(props);

        // This binding is necessary to make `this` work in the callback
        this.state = projects: [], searchParam : '';
        this.raiseInvoiceClicked = this.raiseInvoiceClicked.bind(this);
    
    
    raiseInvoiceClicked()
        // here i wish to write the code for opening the page in new tab.
    
    
    render() 
      return (
         <div>
              <Links activeTabName="tab2"></Links>
              <div className="container">
                  <div className = "row col-md-4">
                      <h1>Raise Invoice...</h1>
                  </div>
                  <div className = "row col-md-4"></div>
                  <div className = "row col-md-4" style ="marginTop":"24px">
                      <button type="button" className="btn btn-default pull-right" onClick=this.raiseInvoiceClicked>Raise Invoice</button>
                  </div>
                  
              </div>
         </div>
      )
    


export default RaiseInvoice;

【问题讨论】:

你用的是哪个版本的 react-router? 什么样的数据? "react-router": "^4.1.2" @jayabalaji j 我必须发送一个数据数组才能在表格中显示它们,以及一些其他细节,如地址标题等..... 【参考方案1】:

由于您要发送大数据,因此将它们附加到您的目标 URL 看起来很糟糕。为此,我建议您使用“LocalStorage”。所以你的代码看起来像这样,

raiseInvoiceClicked()
   // your axios call here
   localStorage.setItem("pageData", "Data Retrieved from axios request")
   // route to new page by changing window.location
   window.open(newPageUrl, "_blank") //to open new page

在您的 RaisedInvoice.jsx 中,像这样从本地存储中检索数据,

componentWillMount() 
  localStorage.pagedata= "your Data";
  // set the data in state and use it through the component
  localStorage.removeItem("pagedata");
  // removing the data from localStorage.  Since if user clicks for another invoice it overrides this data

【讨论】:

只有在链接不指向其他站点时才有效 我收到此错误: 标签上的未知道具参数。从元素中移除这个道具。 @jayabalaji j 你能解释我在哪里以及如何使用这个#?? 我已经使用本地存储更新了代码..请检查【参考方案2】:

你可以只使用普通的 JS 来做这件事,并用它附加一些查询边界

raiseInvoiceClicked()
    const url = 'somesite.com?data=yourDataToSend';
    window.open(url, '_blank');

【讨论】:

我曾经这样做过:history.push( pathname: '/editProject', state: projectData : projectData ) 但有什么方法可以在新标签页中打开... ? 如果它在同一个域中使用@Jayabalaji J 答案,如果它在另一个域中,那么你没有很多选项来传递数据。 url 参数是唯一的方法 如何从新打开的react组件中的url访问数据?? @乔伊 这里有一篇文章,它为您提供了一种从 URL 中提取参数的辅助方法。 ***.com/questions/901115/…【参考方案3】:

在onclick方法中不要调用raiseInvoiceClicked()函数,你可以试试

onClick="window.open('your_url')"

在您的代码中。

【讨论】:

它不起作用,我认为它会给你分配字符串到事件中的错误【参考方案4】:

为什么不用 props 传递这些数据?

...

const href = '...url_to_redirect...';
const data_to_send = 'someTestData';
const api_href = `example.com/api/?$data_to_send`;

export const DictDefaultOptions = ( url:api_href, method='GET') => 
    return 
        url,
        method,
        mode : 'cors' ,
        headers : 
            'Access-Control-Allow-Origin':'*'
        
    ;
;

const sentData =  method:defaultOptions.method, mode: defaultOptions.mode ;

send_data_to_api = () => 
    const api_return = await fetch(api_href, sentData)
    .then(response => response.json()).
    then(responseText => 
        data = (JSON.parse(JSON.stringify(responseText)))
    ) .catch(error => 
         console.log([requestURL] : error);
    );

    do  await this.wait(100)  while(Object.keys(api_return).length <= 0);
    if (Object.keys(api_return).length > 0) 
        return window.open(href, "_blank");
    
;

【讨论】:

伙计,我认为这是最好和最完整的方式...编辑器使代码不太好理解,但我不喜欢那样...给这段代码一个小礼物.. . React APP JS【参考方案5】:

您可以使用以下代码在新窗口中打开它。

请注意,对于道具,您可以传递应在新窗口中呈现的任何子组件。

const RenderInWindow = (props) => 
  const [container, setContainer] = useState(null);
  const newWindow = useRef(null);
useEffect(() => 
    // Create container element on client-side
    setContainer(document.createElement("div"));
  , []);

  useEffect(() => 
    // When container is ready
    if (container) 
      // Create window
      newWindow.current = window.open(
        "",
        "",
        "width=600,height=400,left=200,top=200"
      );
      // Append container
      newWindow.current.document.body.appendChild(container);

      // Save reference to window for cleanup
      const curWindow = newWindow.current;

      // Return cleanup function
      return () => curWindow.close();
    
  , [container]);

  return container && createPortal(props.children, container);
;

【讨论】:

以上是关于如何在单击反应中的按钮时在新选项卡中打开页面?我也想向该页面发送一些数据的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 通过单击按钮在新选项卡中打开给定的 URL

Ajax 在 div 中加载页面内容,但在右键单击时保持“在新选项卡中打开”

怎么单击一个按钮打开一个网页,我是要在新窗口中打开,不是在本窗口中打开.

如何使用 Playwright 打开新标签(例如单击按钮在新标签中打开新部分)

如何使用敲除数据绑定在新选项卡中打开按钮链接

jQuery:检测鼠标单击并在新选项卡中打开目标