我有一个使用material-ui的项目列表。我想在单击该项时调用_handleTouchTap()并将ListItem的键传递给处理程序。
添加
onTouchTap={this._handleTouchTap}
to不能正常工作'这个'似乎是错误的范围
var React = require('react');
var Mui = require('material-ui');
var ThemeManager = new Mui.Styles.ThemeManager();
ThemeManager.setTheme(ThemeManager.types.LIGHT);
var injectTapEventPlugin = require('react-tap-event-plugin');
injectTapEventPlugin();
var List = Mui.List
var ListItem = Mui.ListItem
var Main = React.createClass({
childContextTypes: {
muiTheme: React.PropTypes.object
},
getChildContext: function () {
return {
muiTheme: ThemeManager.getCurrentTheme()
}
},
render: function() {
var items = [
{id: 1, title: 'Item 1'},
{id: 2, title: 'Item 2'},
{id: 3, title: 'Item 3'}
]
return (
<List>
{items.map(function(item){
return <ListItem key={item.id} primaryText={item.title} />
})}
</List>
)
},
_handleTouchTap: function() {
// the key of the item should be passed though here
}
});
React.render(<Main />, document.body);
答案 0 :(得分:6)
如果由于Tim Welch上面提到的问题导致event.target.id
无效,您只需将项目ID作为参数传递给处理函数
render: function() {
var items = [
{id: 1, title: 'Item 1'},
{id: 2, title: 'Item 2'},
{id: 3, title: 'Item 3'}
]
return (
<List>
{items.map(function(item){
return <ListItem key={item.id}
primaryText={item.title}
onTouchTap={this._handleTouchTap.bind(this, item.id)}/>
})}
</List>
)
},
_handleTouchTap: function(id) {
console.log(id) // Logs item id
}
});
如果您使用的是es6,而不是使用onTouchTap={this._handleTouchTap.bind(this, item.id)}
,您可以改为使用es6 fat arrow函数,该函数会自动绑定this
。它可以这样做:
onTouchTap={() => this._handleTouchTap(item.id)}
答案 1 :(得分:1)
分享我学到的东西。查看Material-UI为创建可选列表提供的MakeSelectable高阶组件,该列表为您提供当前所选项目onChange的索引。自问题提出以来,这可能是新的。请注意下面的ListItem上的value属性和SelectableList上的onChange事件。
import {List, ListItem, MakeSelectable} from 'material-ui/List'
SelectableList = MakeSelectable(List)
const siteItems = Object.keys(sites || {}).map((index) => {
const site = sites[index]
return (<ListItem
key={index + 1}
value={site.id}
leftAvatar={<Avatar icon={<PinDrop />} />}
primaryText={site.name}
secondaryText={site.description}
style={styles.list}
/>)
})
CurList = (
<div style={styles.listcontainer}>
<SelectableList onChange={this.siteSelected}>
{siteItems}
</SelectableList>
</div>
)
我发现设置listitem的id并尝试通过event.target.id访问它的模式的问题是,如果你的List项目中有子元素,如图标,标签等,event.target会有所不同大多数列表示例都有。
答案 2 :(得分:0)
你必须设置listitem onTouchTap prop并将event设置为handleTouchTap参数
<ListItem onTouchTap={this._handleTouchTap} />
_handleTouchTap: function(event){
var clickedID = event.target.id
}
答案 3 :(得分:0)
如果您想使用较新的ES6类语法和箭头功能,这可能就是答案。如果使用类语法正确指定this
上下文,则需要显式绑定this
关键字。 onTouchTap
需要一个方法,所以我使用ES6箭头函数返回一个函数。
import { Component, React } from 'react';
import { List, ListItem } from 'material-ui/List';
class Main extends Component {
constructor() {
super(...arguments);
this._handleTouchTap = this._handleTouchTap.bind(this);
}
_handleTouchTap(id) {
return () => console.log(id) // Logs item id
}
render () {
var items = [
{id: 1, title: 'Item 1'},
{id: 2, title: 'Item 2'},
{id: 3, title: 'Item 3'}
];
return (
<List>
{items.map(function(item){
return (
<ListItem
key={item.id}
primaryText={item.title}
onTouchTap={this._handleTouchTap(item.id)}
/>
)
})}
</List>
);
}
}