Reactjs 如何将道具导入正在组件中呈现的函数中

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 } }

在react DApp中,我可以在我的组件主渲染函数中显示Redux存储中的值。但我不知道如何将其传递给正在传递给render main函数的函数。我尝试过的一切都失败了

下面是一些正在运行的代码。我想在其他组件中重用它

我们将重点关注令牌符号

Actions.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
        }
      }
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 &nbsp; {priceSymbol(priceChart.lastPriceChange)} &nbsp; {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 &nbsp; {priceSymbol(priceChart.lastPriceChange)} &nbsp; {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):}像这样写