Вопрос:
Как я могу предоставить методы компонента React в других местах?
Например, я хочу вызвать this.context.router.push (местоположение) React-Router из элемента вне React.
Возможно, я мог бы добавить метод компонента React к объекту окна, чтобы его можно было вызывать из любого общего прослушивателя событий DOM или даже из консоли?
Предпосылки / пример использования:
Я хочу использовать jQuery DataTables в своем приложении React, потому что оно предоставляет множество плагинов и конфигураций, которые по-прежнему недоступны в экосистеме React.
Я начал с существующего компонента данных React (реализация ниже).
В оригинале есть хорошая возможность передать функцию рендеринга, которая может, например, рендерить другие компоненты React внутри ячеек. Ниже ячейки в столбце «Название продукта» отображаются как компоненты React-Router ‹Link />.
const data = [
{
product_id: '5001',
product_price: '$5',
product_name: 'Apple'
},
...
];
const renderUrl =
(val, row) => {
return (<Link to={`/product/${row.product_id}`}>{row.product_name}</Link>);
};
const columns = [
{ title: 'Product Name', prop: 'product_id', render: renderUrl },
{ title: 'Price', prop: 'product_price' },
];
<DataTable
className="datatable-container"
columns={columns}
initialData={data}
/>
То, что я сделал для изменения существующего компонента, включает в себя скрытие таблицы от алгоритма сравнения DOM React, поскольку в противном случае он сломался бы, когда jQuery DataTables изменяет DOM.
- Переместите код компонента render () в настраиваемый метод getDtMarkup () в классе (вне жизненного цикла реакции).
render () теперь выводит пустой div с ref и id
render() { return ( <div> <div ref="dtContainer" id="dtContainer"></div> </div> ); }
componentDidMount использует ReactDomServer.renderToStaticMarkup для превращения компонента React в простую разметку без реакции и добавляет ее в div #dtContainer из render (). Наконец, jQuery DataTables инициализирует визуализированную таблицу html как причудливую «jQuery DataTable».
componentDidMount() { let table = this.getDTMarkup(); let dtContainer = this.refs.dtContainer; let renderedTable = ReactDOMServer.renderToStaticMarkup(table, dtContainer); $('#dtContainer').append(renderedTable); let jqueryTable = $('#dt'); // hard coded in getDTMarkup() for now // Turn html table into a jQuery DataTable with desired config options jqueryTable.DataTable({ dom: '<"html5buttons"B>lTfgitp', buttons: [ 'copy', 'csv', 'excel', 'pdf', 'print' ], "pagingType": 'numbers', "bAutoWidth": false, "bDestroy": true, "fnDrawCallback": function() { console.log('datatables fnDrawCallback'); } }); }
src https://github.com/alecperkey/react-jquery-datatables/blob/master/src/Table.js#L89-L111
Ограничение, из-за которого я задаю этот вопрос, заключается в том, что теперь я не могу использовать компоненты React, такие как ‹Link />, внутри этой статической разметки, отличной от React. Я сейчас использую ‹a href =" ">, но это перезагрузит страницу, что будет медленнее и приведет к белой вспышке браузера.