【发布时间】:2019-10-04 14:12:26
【问题描述】:
我在使用“新”React 上下文 (https://reactjs.org/docs/context.html) 时遇到了严重的问题,无法像文档中想要/期望的那样工作。我正在使用 React v.16.8.6(升级可能需要很长时间,这是一个很大的应用程序)。我知道新旧东西之间有一些混合,但请不要卡在那个上面..
我这样做是为了尽可能灵活,但它不起作用。
问题是,对于contextAddToCart(..),它只执行空函数,而不是我在文档this.addToCart 中定义的函数。我在其他地方也有消费者。似乎它可能以错误的顺序执行此操作。或者每次组件导入 MinicartContext 时,它都会重置为空 fn.. 我不知道如何解决这个问题..
我将发布我认为最能解释它的相关代码:
webpack.config.js:
const APP_DIR = path.resolve(__dirname, 'src/');
module.exports = function config(env, argv = {}) {
return {
resolve: {
extensions: ['.js', '.jsx'],
modules: [
path.resolve(__dirname, 'src/'),
'node_modules',
],
alias: {
contexts: path.resolve(__dirname, './src/contexts.js'),
},
contexts.js
import React from 'react';
export const MinicartContext = React.createContext({
addToCart: () => {},
getState: () => {},
});
MinicartContainer.jsx
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import {
MinicartContext,
} from 'contexts';
export default class MinicartContainer extends Component {
constructor(props) {
super(props);
this.addToCart = (product, qty) => {
const { prices } = product;
const { grandTotal, qtyTotal } = this.state;
this.setState({
grandTotal: grandTotal + prices.price,
qtyTotal: qtyTotal + qty,
});
};
this.state = {
grandTotal: -1,
qtyTotal: -1,
currencyCode: '',
addToCart: this.addToCart,
};
}
render() {
const { children } = this.props;
return (
<MinicartContext.Provider value={this.state}>
{children}
</MinicartContext.Provider>
);
}
Header.jsx:
import React, { Component } from 'react';
import {
MinicartContext,
} from 'contexts';
class Header extends Component {
render() {
return (
<div>
<MinicartContainer MinicartContext={MinicartContext}>
<Minicart MinicartContext={MinicartContext} />
</MinicartContainer MinicartContext={MinicartContext}>
{/* stuff */}
<MinicartContainer MinicartContext={MinicartContext}>
<Minicart MinicartContext={MinicartContext} />
</MinicartContainer MinicartContext={MinicartContext}>
</div>
)
}
}
export default Header;
AddToCartButton.jsx
import {
MinicartContext,
} from 'contexts';
export default class AddToCartButton extends Component {
addToCart(e, contextAddToCart) {
e.preventDefault();
const QTY = 1;
const { product, active } = this.props;
// doing stuff ...
contextAddToCart(product, QTY);
}
render() {
return (
<React.Fragment>
<MinicartContext.Consumer>
{({context, addToCart}) => (
<div
onClick={(e) => { this.addToCart(e, addToCart); }}
【问题讨论】:
-
我认为这很令人困惑,因为你有几个调用相同的函数,向上和向下传递值,你尝试过减速器模式吗?还是只是在上下文中创建函数并根据需要使用它们?
-
@OZZIE 你确定 AddToCartButton 组件安装在反应树的 MinicartContainer 组件下吗?我在代码中看不到它。
-
很难从您发布的代码中看出问题所在。您可能没有正确连接到您的上下文。如果我不得不猜测您可能只是函数本身存在问题。这是一个与您所拥有的接近的工作示例。也许它会帮助codesandbox.io/s/infallible-gates-qox4c
-
我在回答中遗漏的另一件事:在您的
Header.jsx文件中,使用MinicartContainer和Minicart,删除MinicartContext属性。
标签: javascript reactjs react-context