将来自不同组件的参数作为 prop 传递给回调函数

Passing a callback function with arguments coming from different components as a prop

我知道标题不是很清楚,所以也许一个简化的例子会有所帮助。

我有一个负责翻译的react组件(以下是super-simplified版本):

const data = {
  foo: {
    en: 'hello',
    es: 'hola'
  },
  bar: {
    en: 'world',
    es: 'mundo'
  }
  baz: {
    en: 'the answer is {PLACEHOLDER}',
    es: 'la respuesta es {PLACEHOLDER}'
  }
}

const Translation = ({strKey, param, lang}) => {
  const getTranslatedString = () => {
    const translation = data[strKey][lang]
    return (translation.indexOf('{PLACEHOLDER}') > -1 && param)
      ? translation.replace('{PLACEHOLDER}', param)
      : translation
  }
  
  return <p>getTranslatedString()</p>
}

Translation.defaultProps = {
  lang: 'en'
}

export default Translation;

我是这样使用的:

<Translation strKey='baz' param={42} /> // renders as <p>the answer is 42</p>
<Translation strKey='baz' param={42} lang='es' /> // renders as <p>la respuesta es 42</p>

现在我必须修改我的 Translation 组件,以便我可以向它传递一个回调函数来操作翻译后的字符串。此函数需要将 parent 组件中设置的一些参数和 Translation 组件本身中设置的字符串作为输入。这是我卡住的地方,因为我无法理解如何处理来自两个不同组件的参数:

const data = {
  foo: {
    en: 'hello#world',
    es: 'hola#mundo'
  }
}

// utility string manipulation function that will be used as callback
function getStringChunk(str, index) {
  return str.split('#')[index];
}

// Modified `Translation` component
const Translation = ({strKey, param, lang, callback}) => {
  const getTranslatedString = () => {
    const translation = data[strKey][lang]
    return (translation.indexOf('{PLACEHOLDER}') > -1 && param)
      ? translation.replace('{PLACEHOLDER}', param)
      : translation
  }
  
  return <p>{callback ? callback(getTranslatedString()) : getTranslatedString()}</p> // `callback` could be any function with any number of additional arguments 
}

const ParentComponent = ({isFirst}) => {
  return (
    <Translation
      strKey='foo'
      callback={() => {
        const index = isFirst ? 0 : 1;
        getStringChunk(index) // the function expects a first `str` argument but that is set inside the Translation component itself
      }}
    /> // should render either <p>hello</p> or <p>world</p>, depending on the value of `isFirst`
  );
}

我很确定我缺少一些非常基础和基本的东西,一旦有人指出解决方案就会让我觉得自己是个彻头彻尾的白痴,但我有某种“思维障碍”我运行一直在兜圈子,没有找到解决办法。

提前致谢。

也许你可以尝试这样的事情

const ParentComponent = ({isFirst}) => {
  return (
    <div>
    <Translation
      strKey='foo'
      lang={'en'}
      callback={(mystr) => () => {
        const index = isFirst ? 0 : 1;
        return getStringChunk(mystr,index)
      }}
    /> 
    </div>
  );
}

我们创建一个函数,returns 通过获取一个字符串作为回调函数。 然后您可以根据需要在 Translation

中创建回调函数

return <p>{callback ? callback(getTranslatedString())() : getTranslatedString()}</p>