Я только что заметил, что если я определяю нормальные функции компонентов класса, мне больше не нужно связывать их внутри конструктора класса ... (поэтому, даже если я не использую синтаксис поля открытого класса ES6), я могу просто нормально передатьэти функции для моих обработчиков событий с помощью onClick = {this.someFunction} без необходимости предварительно связывать их с моим классом, и это не выдает ошибку при выполнении собственного события DOM (или синтетического события в случае React).И также не имеет значения, использую ли я функцию стрелки в качестве обработчика событий или просто передаю ссылку на функцию ...
это новая функция для React?Я думаю, что несколько месяцев назад этой функции еще не было ..
РЕДАКТИРОВАТЬ: вот пример кода, его простое приложение API подачи новостей, где в индексе есть подкомпонент ListItem, передающий обработчик нажатия ...
import {React, Component, fetch, API_KEY, BASE_URL} from '../config/config';
import ListComponent from '../components/ListComponent';
import PropTypes from 'prop-types';
import { makeStyles } from '@material-ui/core/styles';
import ListItem from '@material-ui/core/ListItem';
import ListItemText from '@material-ui/core/ListItemText';
import { List } from '@material-ui/core';
const useStyles = makeStyles(theme => ({
root: {
width: '100%',
height: 400,
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
}));
export default class index extends Component {
constructor(props) {
super(props);
this.state = {
news: this.props.news
}
}
static async getInitialProps() {
let querystring = `${BASE_URL}top-headlines?q=sex&fsortBy=popularity&apiKey=${API_KEY}`;
console.log(querystring);
let news = await fetch(querystring);
news = await news.json();
//console.log("NEWS:",news.articles);
return {
news: news.articles
}
}
getOutput (e) {
console.log("Item ",e," was clicked!");
}
render() {
return (
<div>
{
this.state.news.map((news,index) => (
// <ListItem button
// key={index}
// onClick={e => this.getOutput(e)}>
// <ListItemText primary={`${news.title}`} />
// </ListItem>
<ListComponent
index = {index}
news = {news}
clicked = {this.getOutput}
/>
)
)
}
</div>
)
}
}
Вот подкомпонент списка:
import React from 'react'
export default function ListComponent({index,clicked,news}) {
return (
<li key={index} onClick ={clicked}>
{
news.title
}
</li>
)
}
Я только что проверил, и это сработало!Примечание. Это пример Next.js, но я также протестировал его в обычном React-приложении (созданном с помощью create-реагировать-app), и он работал с тем же примером ... когда я щелкаю элемент списка, яполучить консольный вывод:
Item Class {dispatchConfig: {…}, _targetInst: FiberNode, nativeEvent: MouseEvent, type: "click", target: li, …} was clicked!