Reactjs 如何将道具导入正在组件中呈现的函数中
在react DApp中,我可以在我的组件主渲染函数中显示Redux存储中的值。但我不知道如何将其传递给正在传递给render main函数的函数。我尝试过的一切都失败了 下面是一些正在运行的代码。我想在其他组件中重用它 我们将重点关注令牌符号 Actions.js强>Reactjs 如何将道具导入正在组件中呈现的函数中,reactjs,react-redux,blockchain,Reactjs,React Redux,Blockchain,在react DApp中,我可以在我的组件主渲染函数中显示Redux存储中的值。但我不知道如何将其传递给正在传递给render main函数的函数。我尝试过的一切都失败了 下面是一些正在运行的代码。我想在其他组件中重用它 我们将重点关注令牌符号 Actions.js export function tokenSymbolLoaded(symbol) { return { type: 'TOKEN_SYMBOL_LOADED', symbol } }
export function tokenSymbolLoaded(symbol) {
return {
type: 'TOKEN_SYMBOL_LOADED',
symbol
}
}
import {tokenLoadedSymbol} from './actions'
export const loadTokenSymbol = async (token, dispatch) => {
const symbol = await token.methods.symbol().call()
console.log(symbol)
dispatch(tokenSymbolLoaded(symbol))
return symbol
}
const tokenSymbolLoaded = state => get(state, 'token.symbol')
export const tokenSymbolLoadedSelector = createSelector(tokenSymbolLoaded, tls => tls)
import { combineReducers } from 'redux';
function token(state = {}, action) {
switch (action.type) {
case 'TOKEN_LOADED':
return { ...state, loaded: true, contract: action.contract }
case 'TOKEN_SYMBOL_LOADED':
return { ...state, loaded: true, symbol: action.symbol}
default:
return state
}
}
Interactions.js强>
export function tokenSymbolLoaded(symbol) {
return {
type: 'TOKEN_SYMBOL_LOADED',
symbol
}
}
import {tokenLoadedSymbol} from './actions'
export const loadTokenSymbol = async (token, dispatch) => {
const symbol = await token.methods.symbol().call()
console.log(symbol)
dispatch(tokenSymbolLoaded(symbol))
return symbol
}
const tokenSymbolLoaded = state => get(state, 'token.symbol')
export const tokenSymbolLoadedSelector = createSelector(tokenSymbolLoaded, tls => tls)
import { combineReducers } from 'redux';
function token(state = {}, action) {
switch (action.type) {
case 'TOKEN_LOADED':
return { ...state, loaded: true, contract: action.contract }
case 'TOKEN_SYMBOL_LOADED':
return { ...state, loaded: true, symbol: action.symbol}
default:
return state
}
}
Selectors.js强>
export function tokenSymbolLoaded(symbol) {
return {
type: 'TOKEN_SYMBOL_LOADED',
symbol
}
}
import {tokenLoadedSymbol} from './actions'
export const loadTokenSymbol = async (token, dispatch) => {
const symbol = await token.methods.symbol().call()
console.log(symbol)
dispatch(tokenSymbolLoaded(symbol))
return symbol
}
const tokenSymbolLoaded = state => get(state, 'token.symbol')
export const tokenSymbolLoadedSelector = createSelector(tokenSymbolLoaded, tls => tls)
import { combineReducers } from 'redux';
function token(state = {}, action) {
switch (action.type) {
case 'TOKEN_LOADED':
return { ...state, loaded: true, contract: action.contract }
case 'TOKEN_SYMBOL_LOADED':
return { ...state, loaded: true, symbol: action.symbol}
default:
return state
}
}
Reducers.js强>
export function tokenSymbolLoaded(symbol) {
return {
type: 'TOKEN_SYMBOL_LOADED',
symbol
}
}
import {tokenLoadedSymbol} from './actions'
export const loadTokenSymbol = async (token, dispatch) => {
const symbol = await token.methods.symbol().call()
console.log(symbol)
dispatch(tokenSymbolLoaded(symbol))
return symbol
}
const tokenSymbolLoaded = state => get(state, 'token.symbol')
export const tokenSymbolLoadedSelector = createSelector(tokenSymbolLoaded, tls => tls)
import { combineReducers } from 'redux';
function token(state = {}, action) {
switch (action.type) {
case 'TOKEN_LOADED':
return { ...state, loaded: true, contract: action.contract }
case 'TOKEN_SYMBOL_LOADED':
return { ...state, loaded: true, symbol: action.symbol}
default:
return state
}
}
组件(删除不必要的html)
从“../store/interactions”导入{tokenSymbolLoadedSelector}
类MyTransactions扩展组件{
render(){
返回(
{this.props.symbol}
)
}
}
函数MapStateTops(状态){
返回{
符号:标记符号加载选择器(状态)
}
}
导出默认连接(MapStateTops)(MyTransactions);
此代码正在运行。现在我想在我的DApp的其他组件中重用这个符号选择器。但是另一个组件是由多个功能组成的,这就是它不起作用的地方,我想知道为什么
另一个组件内的非工作代码
import {
priceChartLoadedSelector,
priceChartSelector,
tokenSymbolLoadedSelector
} from '../store/selectors'
const showPriceChart = (priceChart) => {
return(
<h4>{this.props.symbol}/ETH {priceSymbol(priceChart.lastPriceChange)} {priceChart.lastPrice}</h4>
)
}
class PriceChart extends Component {
render() {
return (
<div >
{this.props.priceChartLoaded ? showPriceChart(this.props.priceChart) : <Spinner />}
</div>
)
}
}
function mapStateToProps(state) {
return {
priceChartLoaded: priceChartLoadedSelector(state),
priceChart: priceChartSelector(state),
symbol: tokenSymbolLoadedSelector(state),
}
}
export default connect(mapStateToProps)(PriceChart)
导入{
PriceChartedSelector,
价格表选择器,
标记符号加载选择器
}来自“../store/selectors”
常量showPriceChart=(价格图表)=>{
返回(
{this.props.symbol}/ETH{priceSymbol(priceChart.lastPriceChange)}{priceChart.lastPrice}
)
}
类PriceChart扩展组件{
render(){
返回(
{this.props.priceChart已加载?showPriceChart(this.props.priceChart):}
)
}
}
函数MapStateTops(状态){
返回{
priceChartLoaded:priceChartLoadedSelector(状态),
价格图表:价格图表选择器(状态),
符号:标记符号加载选择器(状态),
}
}
导出默认连接(MapStateTops)(价格表)
这是引发的错误:
未经处理的拒绝(TypeError):无法读取未定义的属性“props”嗯,代码无法工作的原因是您试图从类组件中调用showPrice方法。如果你叫它。它可能会被调用,但您将无法引用
此
关键字。你应该这样写。除了希望之外,还有一种叫做priceSymbol
的方法
class PriceChart extends Component {
showPriceChart = (priceChart) => {
return(
<h4>{this.props.symbol}/ETH {priceSymbol(priceChart.lastPriceChange)} {priceChart.lastPrice}</h4>
)
}
render() {
return (
<div >
{this.props.priceChartLoaded ? this.showPriceChart(this.props.priceChart) : <Spinner />}
</div>
)
}
}
类价格表扩展组件{
showPriceChart=(价格图表)=>{
返回(
{this.props.symbol}/ETH{priceSymbol(priceChart.lastPriceChange)}{priceChart.lastPrice}
)
}
render(){
返回(
{this.props.priceChart已加载?this.showPriceChart(this.props.priceChart):}
)
}
}
错误发生在哪里?您是否有可用的stacktrace可用于更新问题?错误发生在{this.props.symbol}。什么是stacktrace?它是redux dev中的跟踪选项吗?它是控制台中通常伴随错误的输出,告诉您调用了哪些函数并包括行号。“stack”表示调用堆栈,因此在读取时,您会看到它与调用的顺序相反,即从最新的调用开始并向后运行。非常确定的问题是showPriceChart
不是PriceChart
的方法,因此它无法访问此.props
。如果希望将符号分开,可以将其作为参数传递。@lawrence witt我已经尝试过const showPriceChart=(priceChart,symbol)。我没有得到这样的错误,但它的符号没有显示。它是未定义的Price symbol正在工作是这个.props.symbol导致了错误当然,是this.props.symbol
这就是我为您编写代码的原因。我说priceSymbol存在是因为我在任何地方都没有看到它。但我知道问题不在于priceSymbol
,而在于这个.props.symbol
。上面的代码修复了您试图访问类组件外部的道具的问题。这就是为什么this.props.symbol
不起作用。请尝试上面的代码。您没有将this
关键字添加到showPriceCart。添加它并让我知道它说了什么{this.props.priceChartLoaded?this.showPriceChart(this.props.priceChart):}像这样写