#reactjs #react-redux #react-router #react-hooks #stripe-payments
#reactjs #react-redux #react-router #реагирующие хуки #stripe-платежи
Вопрос:
У меня есть приложение, которое было написано в основном с использованием компонентов react на основе классов, однако мы внедряем функцию платного доступа с Stripe.
Проблема в том, что stripe использует перехваты, которые не работают с базовыми компонентами класса. Возможно ли для достижения этой цели поместить базовый компонент дочернего класса в базовый компонент родительской функции. Как бы я мог это сделать, не переписывая каждый компонент в качестве базового компонента функции.
Каждая попытка включить базовый компонент функции с дочерними элементами базового класса всегда приводит к этой ошибке:
Ошибка: недопустимый вызов перехвата. Перехваты могут вызываться только внутри тела функционального компонента.
Есть ли какие-либо обходные пути, или я должен переписать все компоненты как функциональные компоненты?
Краткий пример использования react-router-dom для параметров запроса, а затем передачи их в дочерний компонент базового класса.
function useQuery() {
return new URLSearchParams(useLocation().search);
}
const App = () => {
let query = useQuery();
return (
<Provider store={store}>
<Router>
<div className="App">
<Navbar />
<Switch>
{/* Public Pages */}
<Route exact path="/" component={Landing} ref={query.get('ref')} />
</Switch>
</div>
</Router>
</Provider>
)
}
export default App;
Затем предположим, что целевые компоненты — это простой базовый компонент класса, который установит prop в состояние.
Комментарии:
1. Если бы вы могли поместить какой-нибудь пример кода в файлы, над которыми вы работаете, это могло бы помочь вам лучше. Безусловно, вы можете использовать функциональные компоненты в качестве родительских, а компонент класса — в качестве дочернего,
Ответ №1:
Тип компонента не имеет значения в отношении родитель-потомок. Но вы не можете использовать перехваты внутри компонента на основе класса. Только в функциональных
Комментарии:
1. Привет, пока я ценю комментарий. Меня больше беспокоит, могу ли я использовать перехваты в родительском функциональном компоненте, а затем передавать их в компонент дочернего класса
2. Да, я пробовал это с
useCallback
тем же хуком, что и другие. Я передал его компоненту и вызвал его. Вы не можете передать перехват, но это результат, который вы можете. В приведенном вами примере вы передаете только результат хука. Это должно сработать. Более точный пример кода был бы лучше для понимания
Ответ №2:
Вот пример кода функционального компонента в качестве родительского и класса в качестве дочернего
import React , {Component}from "react";
import "./styles.css";
const App = () => {
return (
<div className="App">
<h1>I Am Parent Functional Component</h1>
<Child />
</div>
);
};
export default App;
class Child extends Component
{
render(){
return(
<h2>I am Class Child Component</h2>
)
}
}
Комментарии:
1. Ах да, однако мой вопрос в том, разрешено ли мне использовать перехваты в родительском функциональном компоненте, а затем передавать эти данные дочернему компоненту класса. Я пробовал, но получил сообщение об ошибке. (Ошибка: недопустимый вызов перехвата. Хуки могут вызываться только внутри тела функционального компонента.). Я надеялся выяснить, связана ли проблема с функциональностью дочернего компонента.
Ответ №3:
Хорошо, я разобрался с этой проблемой. Поскольку я нашел тот же вопрос без ответа в Интернете, я решил ответить на этот вопрос сам, просто для справки в будущем для тех, кто ищет то же решение, с которым я столкнулся.
Вы можете использовать перехваты для базового компонента родительской функции и передавать информацию в дочерний базовый компонент.
При рендеринге приложения мне было выдано сообщение об ошибке
Error: Invalid hook call. Hooks can only be called inside of the body of a function component.
Однако эта ошибка была вызвана устаревшими модулями в npm. Я только что обновил react-router-dom с 4.1 до 5.2.0 npm update react-router-dom
, и, похоже, это решает проблему использования функционального базового компонента в качестве родительского.
После обновления модуля я смог использовать перехваты в базовом компоненте родительской функции и передать их базовому компоненту дочернего класса, используя props.