我正在使用react并且没有名为“Button.jsx”的状态组件,并且我将向按钮组件发送一个函数(通过props),如下所示:
app.jsx
addValue(){
console.log("add")
}
<Button className="btn btn-primary" text="click" action={this.addValue}/>
import React from 'react'
export default class Button extends React.Component{
constructor(props){
super(props)
this.action = this.action.bind(this);
}
action(e){
// console.log(this.props.action)
const {props} = this,{action = ()=>{}} = props;
action()
}
render() {
return (
<button className={this.props.className} onClick={this.action}>{this.props.text}</button>
)
}
}
我知道它有效(执行addValue()
)。但是怎么样?关键点在action(e)
函数上,任何人都可以解释吗?
答案 0 :(得分:0)
我不确定我是否理解你的问题,但我可以引导你完成它:
addValue
)传递给您的子组件(button.jsx),该组件在调用时记录“add”。请注意,您要将addValue
函数作为道具action
传递:action={this.addValue}
addValue
)。action
),然后将其传递给渲染中onClick
的{{1}}。button
函数中,您可以从上下文访问道具:action
,然后从道具const {props} = this
获取action
函数。 {action = ()=>{}} = props
作为addValue
向下传递,然后在子级中定义本地action
,该子级调用另一个action
传递下来。使用此设置,您的button.jsx包含action
和this.action
,它们最终都会执行相同的操作。因此,你的Button.jsx可能看起来像这样,并做同样的事情:
this.props.action
我猜你在button.jsx中有两个import React from 'react'
export default class Button extends React.Component{
render() {
return (
<button className={this.props.className} onClick={this.props.action}>{this.props.text}</button>
)
}
}
感到困惑。
希望有所帮助,如果您有任何其他问题,请告诉我。
答案 1 :(得分:0)
将一些值(字符串,数字或函数)传递给react组件属性(例如<Button text="click" action={this.addValue}/>
)。您可以在此组件中获取它,例如this.props.
+属性的名称。对于上面提到的Button
组件,this.props.text
返回click
字符串,this.props.action
返回addValues
函数(您在父组件中定义它),您可以调用它使用()
- this.props.action()
;
react.js中有一些特殊属性。处理某些事件的属性:onClick
,onMouseEnter
,onMouseMove
等。您可以将此函数传递给此属性,并在触发相应事件时执行此函数。在您的示例中,您将组件方法action
传递给onClick
属性。
在action
方法中有一些es6魔法。它被称为对象解构,您可以阅读更多关于它的here。如果有某个对象,可以通过以下方式将此对象的属性值分配给具有相同名称的变量:
var object = {p: 42, q: true};
var {p, q, d = 'default' } = object;
console.log(p); // 42
console.log(q); // true
console.log(d); // 'default'
如果对象在变量d = 'default'
中没有d
名称的属性,则还可以指定一些默认值d
,并为其分配字符串default
。如果由于某种原因,我们不会将值传递给action
组件属性,则此代码:const {props} = this, {action = ()=>{}} = props;
将noop函数() => {}
分配给action
变量并调用action()
不要抛出错误。
因此,在您的情况下,您可以重写它:
action(e){
const {props} = this,{action = ()=>{}} = props;
action()
}
为:
action(e){
const props = this.props;
const action = props.action || (() => {});
action();
}
在此处查看此示例 - https://jsfiddle.net/kxrkddmm/