我对道具和功能组件有一个看似微不足道的问题。基本上,我有一个容器组件,它在状态改变时呈现Modal组件,这是由用户单击按钮触发的。模态是一个无状态功能组件,它包含一些需要连接到容器组件内部功能的输入字段。
我的问题:当用户与无状态模态组件中的表单字段交互时,如何使用父组件内部的函数来更改状态?我错误地传递道具吗?提前谢谢。
容器
export default class LookupForm extends Component {
constructor(props) {
super(props);
this.state = {
showModal: false
};
}
render() {
let close = () => this.setState({ showModal: false });
return (
... // other JSX syntax
<CreateProfile fields={this.props} show={this.state.showModal} onHide={close} />
);
}
firstNameChange(e) {
Actions.firstNameChange(e.target.value);
}
};
功能(模态)组件
const CreateProfile = ({ fields }) => {
console.log(fields);
return (
... // other JSX syntax
<Modal.Body>
<Panel>
<div className="entry-form">
<FormGroup>
<ControlLabel>First Name</ControlLabel>
<FormControl type="text"
onChange={fields.firstNameChange} placeholder="Jane"
/>
</FormGroup>
);
};
示例:说我想从Modal组件中调用this.firstNameChange
。我想&#34;解构&#34;将道具传递给功能组件的语法让我有点困惑。即:
const SomeComponent = ({ someProps }) = > { // ... };
答案 0 :(得分:12)
您需要为每个需要调用的函数单独传递每个道具
<CreateProfile
onFirstNameChange={this.firstNameChange}
onHide={close}
show={this.state.showModal}
/>
然后在CreateProfile组件中可以执行
const CreateProfile = ({onFirstNameChange, onHide, show }) => {...}
通过解构,它会将匹配的属性名称/值分配给传入的变量。名称只需与属性匹配
或只是做
const CreateProfile = (props) => {...}
并在每个地方拨打props.onHide
或您尝试访问的任何道具。
答案 1 :(得分:1)
上述答案的补充。
如果React
抱怨任何传递的props
是undefined
,那么您将需要用default
值破坏这些道具(通常是传递函数,数组或对象文字)例如
const CreateProfile = ({
// defined as a default function
onFirstNameChange = f => f,
onHide,
// set default as `false` since it's the passed value
show = false
}) => {...}
答案 2 :(得分:1)
我正在使用React函数组件
在父组件中,首先传递概率,如下所示
import React, { useState } from 'react';
import './App.css';
import Todo from './components/Todo'
function App() {
const [todos, setTodos] = useState([
{
id: 1,
title: 'This is first list'
},
{
id: 2,
title: 'This is second list'
},
{
id: 3,
title: 'This is third list'
},
]);
return (
<div className="App">
<h1></h1>
<Todo todos={todos}/> //This is how i'm passing probs in parent component
</div>
);
}
export default App;
然后在子组件中使用 probs (如下所示)
function Todo(props) {
return (
<div>
{props.todos.map(todo => { // using probs in child component and looping
return (
<h1>{todo.title}</h1>
)
})}
</div>
);
}
答案 3 :(得分:1)
只需在源组件上执行
<MyDocument selectedQuestionData = {this.state.selectedQuestionAnswer} />
然后在目标组件上执行此操作
const MyDocument = (props) => (
console.log(props.selectedQuestionData)
);