亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在React.js中將道具傳遞給父組件

在React.js中將道具傳遞給父組件

三國紛爭 2019-07-06 13:14:29
在React.js中將道具傳遞給父組件難道沒有一個簡單的方法可以通過一個孩子的props在React.js中使用事件傳遞給它的父?var Child = React.createClass({   render: function() {     <a onClick={this.props.onClick}>Click me</a>   }});var Parent = React.createClass({   onClick: function(event) {     // event.component.props ?why is this not available?   },   render: function() {     <Child onClick={this.onClick} />   }});我知道您可以使用受控組件來傳遞輸入的值,但是最好傳遞整個工具包n‘kaboodle。有時,子組件包含一組信息,您希望不必查找。也許有一種將組件綁定到事件的方法在使用了一年多的Reaction之后,在SebastianLorber的回答的激勵下,我總結出將子組件作為參數傳遞給父母中的函數是不事實上,這種反應方式,也不是一個好主意。我換了答案。
查看完整描述

3 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

OP使這個問題成為一個移動的目標。它又被更新了。因此,我覺得有責任更新我的答復。

首先,回答您提供的示例:

是的,這是可能的。

您可以通過更新child的onClick成為this.props.onClick.bind(null, this):

var Child = React.createClass({
  render: function () {
    return <a onClick={this.props.onClick.bind(null, this)}>Click me</a>;
  }});

然后,父類中的事件處理程序可以訪問組件和事件,如下所示:

  onClick: function (component, event) {
    // console.log(component, event);
  },

JSBin快照


但這個問題本身就有誤導性。

父母已經知道孩子的props.

在提供的示例中,這一點并不清楚,因為實際上沒有提供任何道具。這個示例代碼可能更好地支持被問到的問題:

var Child = React.createClass({
  render: function () {
    return <a onClick={this.props.onClick}> {this.props.text} </a>;
  }});var Parent = React.createClass({
  getInitialState: function () {
    return { text: "Click here" };
  },
  onClick: function (event) {
    // event.component.props ?why is this not available? 
  },
  render: function() {
    return <Child onClick={this.onClick} text={this.state.text} />;
  }});

在這個例子中,你已經清楚地知道了什么是孩子的道具。

JSBin快照


如果它真的是關于使用孩子的道具…

如果它真的是關于使用一個孩子的道具,你可以完全避免任何與孩子的勾搭。

JSX有一個擴展屬性我經常在一些組件上使用API,比如child。它需要所有的props并將它們應用到組件中。孩子的樣子是這樣的:

var Child = React.createClass({
  render: function () {
    return <a {...this.props}> {this.props.text} </a>;
  }});

允許您直接在父級中使用這些值:

var Parent = React.createClass({
  getInitialState: function () {
    return { text: "Click here" };
  },
  onClick: function (text) {
    alert(text);
  },
  render: function() {
    return <Child onClick={this.onClick.bind(null, this.state.text)} text={this.state.text} />;
  }});

JSBin快照


當您連接其他的子組件時,不需要額外的配置

var Parent = React.createClass({
  getInitialState: function () {
    return {
      text: "Click here",
      text2: "No, Click here",
    };
  },
  onClick: function (text) {
    alert(text);
  },
  render: function() {
    return <div>
      <Child onClick={this.onClick.bind(null, this.state.text)} text={this.state.text} />
      <Child onClick={this.onClick.bind(null, this.state.text2)} text={this.state.text2} />
    </div>;
  }});

JSBin快照

但我懷疑這不是你的實際用例。讓我們進一步挖掘…


一個健壯的實例

提供的示例的泛型性質很難討論。我創建了一個組件,演示了上述問題的實際用途,在雷克蒂途徑:

DTServiceCalculator工作示例
DTServiceCalculator回購

此組件是一個簡單的服務計算器。您將為它提供一個服務列表(包括名稱和價格),它將計算所選價格的總和。

孩子們完全無知。

ServiceItem是本例中的子組件。它對外界的看法不多。它需要一些道具,其中之一是單擊時要調用的函數。

<div onClick={this.props.handleClick.bind(this.props.index)} />

它只會打電話給提供的handleClick提供的回調index[來源].

父母是孩子

DTServicesCalculator父組件是此示例。也是個孩子。讓我們看看。

DTServiceCalculator創建子組件列表(ServiceItem為他們提供道具[來源]。它是ServiceItem但是它是組件的子組件,將列表傳遞給它。它不擁有數據。因此,它再次將組件的處理委托給其父組件。來源

<ServiceItem chosen={chosen} index={i} key={id} price={price} name={name} onSelect={this.props.handleServiceItem} />

handleServiceItem捕獲索引,從子節點傳遞索引,并將其提供給其父對象[來源]

handleServiceClick (index) {
  this.props.onSelect(index);}

所有人都知道

“所有權”概念是反應中的一個重要概念。我建議多讀一些關于它的文章。這里.

在我展示的示例中,我一直將事件的處理委托到組件樹上,直到我們到達擁有狀態的組件為止。

當我們最終到達那里時,我們會像這樣處理狀態選擇/取消選舉。來源]:

handleSelect (index) {
  let services = […this.state.services];
  services[index].chosen = (services[index].chosen) ? false : true;
  this.setState({ services: services });}


結語

盡量保持最外層的部件盡可能不透明。努力確保他們對父組件選擇如何實現它們有很少的偏好。

要知道誰擁有您正在操作的數據。在大多數情況下,您需要將處理樹的事件委托給以下組件:擁有那個州。

旁白:通量模式是減少應用程序中這種必要連接的好方法。


查看完整回答
反對 回復 2019-07-06
?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

似乎有一個簡單的答案??紤]到這一點:

var Child = React.createClass({
  render: function() {
    <a onClick={this.props.onClick.bind(null, this)}>Click me</a>
  }});var Parent = React.createClass({
  onClick: function(component, event) {
    component.props // #=> {Object...}
  },
  render: function() {
    <Child onClick={this.onClick} />
  }});

鑰匙在打電話bind(null, this)this.props.onClick事件,從父級傳遞?,F在,onclick函數接受參數component,和event..我認為這是世界上最好的

這是一個糟糕的想法:讓子實現細節泄露給父程序從來不是一條好途徑。見塞巴斯蒂安·洛伯的答案。


查看完整回答
反對 回復 2019-07-06
  • 3 回答
  • 0 關注
  • 690 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號