我的应用程序中有一个评论部分,它使用用户的用户名作为标题以及他们的评论。除非用户尚未设置用户名,否则一切正常。我正在尝试创建一个条件,如果用户没有设置用户名,它将是匿名的。
我正在使用 Redux 添加评论。
这是我的代码,我将操作与用户名、uid 和评论一起调度给操作创建者:
const review = this.props.review.review;
//const username = this.props.userData.username.username;
const uid = this.props.string.uid;
const username = () => {
if (!this.props.userData.username.username) {
return 'Anonymous';
}
return this.props.userData.username.username;
};
//dispatch action with my values
this.props.submitUserReview({ review, username, uid });
我感谢对此问题的任何帮助和指导。干杯!
解决:
我通过使用lodash解决了这个问题,这要归功于Noah Allen:
const username = _.get(userData, 'username.username', 'Anonymous'(
编辑:洛达什单行:
const username = _.get(userData, 'username.username', 'Anonymous')
要修复您的示例,您实际上只需要添加一对括号(解释如下(:
this.props.submitUserReview({ review, username: username(), uid });
更进一步,您应该这样做以帮助提高代码的可读性、重用和抽象:
function checkUsername (userData) {
// Checks for undefined, null, and a string with no characters:
if (userData && userData.username && userData.username.username && username.length > 0) {
return userData.username.username
}
// Default case:
return 'Anonymous'
}
然后在组件中:
this.props.submitUserReview({ review, username: checkUsername(this.props.userData), uid })
基本上,您将函数用户名传递给提交,而不是运行函数并将函数的结果传递给提交。在此示例中,您将在其他地方定义检查用户名函数以帮助进行抽象。然后在提交中运行函数并将其结果传递给submitUserReview
函数。
请注意,在 JS 中,当你有一个函数:const x = () => 1
时,x 的类型将是一个函数。一旦使用括号,就会调用该函数:x()
,并返回值。因此,在您的原始示例中,您将x
作为参数传递 - 这意味着它从未被计算过,并且您将函数传递到您的商店中。您需要从中获取值并将其传递给 redux。
在将函数绑定到组件时,了解这一点也很好。例如:<Button onPress={this.doSomething()} />
.在这种情况下,函数doSomething
将在加载按钮时进行评估,当您在点击按钮时确实想对其进行评估时,如下所示:Button onPress={this.doSomething} />
.在这种情况下,onPress 会评估函数,因此您无需自己操作。
解决问题的另一种方法是在呈现用户名的组件中:
<Text>{review.username ? review.username : 'Anonymous'}</Text>
如果用户名存在于审阅对象中(或者它在您的组件中看起来如何(,则有条件地显示用户名,否则显示匿名。如果您需要判断评论是否真的在其他地方有用户名,这可能会有所帮助。
你不需要为这个小东西创建功能。你可以用下面的方式写它:
this.props.submitUserReview({ review, username: (this.props.userData.username.username || "Anonymous"), uid });
在这里,如果this.props.userData.username.username
的值是假的,即空或未定义的或空字符串,那么它将Anonymous
作为参数传递。因此,它将解决您的用例。