gpt4 book ai didi

reactjs - 如何处理React.js中子组件的点击事件,是否有React "way"?

转载 作者:行者123 更新时间:2023-12-03 13:16:55 25 4
gpt4 key购买 nike

我正在尝试创建/原型(prototype)一个小部件,该小部件具有搜索过滤器和具有键值/父子关系的 2 个面板。右侧面板包含类别,左侧面板包含与单个类别相关的兴趣。可选择类别行以显示关联的兴趣复选框。我还没有达到尝试了解如何使用复选框更新表单提交的程度,首先我需要了解更多有关使数据流动的正确方法的信息。

这是我第一次尝试 React,我知道 React 鼓励单向数据流。我觉得我使用 jQuery 处理事件来错误地更新兴趣面板。我想知道更新兴趣面板的一些替代方法。

根据我所读到的内容,为了更新父组件(我相信它在 React 文档中称为所有者)组件,您需要在子/所有者组件上定义回调。如果我错误地使用了状态与 Prop 的兴趣,我将不胜感激。我试图只让搜索过滤器和复选框成为小部件状态的一部分,因为我读到可过滤数据应该属于 props。

更新:我更改了要在 getDefaultProps 中初始化的兴趣,所以现在我将它们用作 Prop 。我认为这更像是 React 方式,我是对的吗?我还通过更改handleCategoryRowClick 函数来更改更新兴趣的方式。我认为我现在正在以更多的 React 方式做事,但仍然希望任何有更多使用 React 经验的人能够提供的建议,谢谢。

任何帮助将不胜感激!

/** @jsx React.DOM */

var InterestRow = React.createClass({
render: function() {
return (
<div>
<label>{this.props.interest.name}</label>
<input type="checkbox" ref={this.props.key} value={this.props.key} />
</div>
)
}
});

var InterestPanel = React.createClass({
var interestPanel = this;
var rows = [];

render: function() {
var rows = [];
var i = 0;

_(this.props.interests).each(function (interest) {
rows.push(<InterestRow interest={interest} key={interest.value} />);
});

return (
<form>{rows}</form>
)
}
});

var CategoryRow = React.createClass({
render: function() {
return (
<li onClick={this.props.handleClick.bind(null, this.props.interests)}>{this.props.category}</li>
)
}
});

var CategoriesPanel = React.createClass({
render: function() {
var categoriesPanel = this;
var rows = [];
var categories = [];
var interests = [];
var interestSet = [];
var missedSet = [];
var lastCategory = null;
var category;
var interest;
var i = 0;

_.each(categoriesPanel.props.data, function (datum) {
name = datum.name;
value = datum.targeting_value;
category = name.split('/')[0];
interest = {name: name.split('/')[1], value: value}

if (_.contains(interest.name.toLowerCase(), categoriesPanel.props.searchText.toLowerCase())) {
if (category !== lastCategory) {
if (interestSet.length > 0) {
interests.push(interestSet.concat(missedSet));
}

lastCategory = category;
categories.push(category);
interestSet = [];
interestSet.push(interest);
missedSet = [];
} else {
if (!_.contains(categories, category)) {
categories.push(category);
interestSet.push(interest);
} else {
interestSet.push(interest);
}
}
} else {
if (category !== lastCategory) {
if (interestSet.length > 0) {
interests.push(interestSet.concat(missedSet));
}

lastCategory = category;
interestSet = [];
missedSet = [];
missedSet.push(interest);
} else {
missedSet.push(interest);
}
}
});

if (interestSet.length > 0) {
interests.push(interestSet.concat(missedSet));
}

var interestsObject = _.zipObject(categories, interests);

_.each(interestsObject, function (interestSet, category) {
i++;
rows.push(<CategoryRow category={category} key={i} interests={interestSet} handleClick={categoriesPanel.props.handleClick} />)
});

return (
<div>
<ul>{rows}</ul>
</div>
)
}
});

var SearchBar = React.createClass({
handleChange: function() {
this.props.onUserInput(
this.refs.searchTextInput.getDOMNode().value
)
},
render: function() {
return (
<form onSubmit={this.handleSubmit}>
<input
type="text"
placeholder="Search Interests..."
value={this.props.searchText}
ref="searchTextInput"
onChange={this.handleChange}
/>
</form>
);
}
});

var InterestsTable = React.createClass({
loadDataFromTwitter: function() {
$.ajax({
url: this.props.url,
dataType: 'json',
success: function(data) {
this.setProps({data: data});
}.bind(this)
});
},
getInitialState: function() {
return {
searchText: ''
}
},
getDefaultProps: function() {
return {
data: [],
interests: []
}
},
componentWillMount: function() {
this.loadDataFromTwitter();
},
handleUserInput: function(searchText) {
this.setState({
searchText: searchText
});
},
handleCategoryRowClick: function(interests) {
this.setProps({
interests: interests
});
},
render: function() {
return (
<div>
<SearchBar
searchText={this.state.searchText}
onUserInput={this.handleUserInput}
/>
<CategoriesPanel
data={this.props.data}
searchText={this.state.searchText}
handleClick={this.handleCategoryRowClick}
/>
<InterestsPanel
interests={this.props.interests}
searchText={this.state.searchText}
/>
</div>
);
}
});

React.renderComponent(
<InterestsTable url="/api/interests" />,
document.getElementById('content')
);

最佳答案

  • 有一些残留的 jQuery 可以删除:
    componentDidMount: function() {
$(document).on("handleCategoryRowClick", this.handleCategoryRowClick);
},
  • 尽可能将 props 视为不可变,并响应生命周期循环方法将按预期工作。在这种情况下,兴趣应该是state 而不是 props 因为 InterestsTable 组件拥有并修改它;它不是由组件的父组件传入的:
    getInitialState: function() {
return {
interests: [],
searchText: ""
};
},
handleCategoryRowClick: function(e, interests) {
this.setState({
interests: interests
});
},

关于reactjs - 如何处理React.js中子组件的点击事件,是否有React "way"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23485242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com