javascript - TypeError: Cannot read property 'spirit' of undefined -- 该属性可以在页面刷新时读取
问题描述
const QueueItem = (props) => {
let spirit = props.drink.spirit ? (
<div>
{props.drink.spiritquantity} | {props.drink.spirit}
</div>
) : (
<div> No Spirit </div>
);
let liqueur = props.drink.liqueur ? (
<div>
{props.drink.liqueurquantity} | {props.drink.liqueur}
</div>
) : (
<div> No Liqueur </div>
);
let mixer = props.drink.mixer ? (
<div>
{props.drink.mixerquantity} | {props.drink.mixer}
</div>
) : (
<div> No Mixer </div>
);
let cocktail = props.drink.cocktail ? (
<div>
{props.drink.user[0].name}
<div>{props.drink.cocktail}</div>
</div>
) : (
<div>
{" "}
{props.drink.user[0].name}
<div>{spirit}</div>
<div>{mixer}</div>
<div>{liqueur}</div>
</div>
);
let logged = (
<div>
<Button
variant="warning"
onClick={() => props.handleDeleteDrink(props.drink._id)}
>
Remove From Queue
</Button>{" "}
</div>
);
if (props.user.email === "admin@gmail.com") {
return (
<div className="drink-item">
<div>{cocktail}</div>
<div>{logged}</div>
</div>
);
} else if (props.user) {
let logged =
props.user._id === props.drink.user[0]._id ? (
<div>
<Button
variant="warning"
onClick={() => props.handleDeleteDrink(props.drink._id)}
>
Remove From Queue
</Button>{" "}
</div>
) : (
<input type="hidden" />
);
return (
<div className="drink-item">
<div>{cocktail}</div>
<div>{logged}</div>
</div>
);
} else {
return (
<div className="drink-item">
<div>{cocktail}</div>
</div>
);
}
};
export default QueueItem;
我在顶部定义的所有变量上都获得了未定义的属性。页面重新加载后,它们都会正确加载。它总是在创建并添加到我的数据库中的新鲜项目上。(默恩)
像这样在我的顶层添加项目。
handleSubmit = (e) => {
e.preventDefault();
this.handleAddDrink(this.state.drinkInfo);
console.log("HANDLE SUBMIT", this.state.drinkInfo);
};
handleAddDrink = async (drinkIngredients) => {
console.log(`DRINK WILL BE ${drinkIngredients}`);
drinkIngredients.user = userService.getUser();
const newDrink = await drinkService.create(drinkIngredients);
this.setState((state) => ({
drinks: [...state.drinks, newDrink],
}));
};
当我的表单被提交时,这些函数被触发并且饮料被正确地添加到数据库中。我的表单提交按钮目前没有重定向,但如果有人能帮助我了解如何在第一次渲染页面时定义第一个组件中的道具而不需要刷新页面,我会很高兴。
道具是这样传下来的
<Route
exact
path="/queue"
render={({ history }) => (
<QueuePage
queue={this.state.queue}
drinks={this.state.drinks}
handleDeleteDrink={this.handleDeleteDrink}
handleNewDrinkClick={this.handleNewDrinkClick}
handleLogout={this.handleLogout}
user={this.state.user}
history={history}
/>
)}
/>
const QueuePage = (props) => (
<div className="QueuePage">
<NavBar user={props.user} handleLogout={props.handleLogout} />
<div className="queue">
<QueueList
queue={props.queue}
drinks={props.drinks}
handleDeleteDrink={props.handleDeleteDrink}
user={props.user}
/>
</div>
</div>
);
return (
<div className="QueueList">
<h1 className="queue-title">Drink Queue</h1>
<div className="drink-list">
{props.drinks.map((drink) => (
<QueueItem
drink={drink}
handleDeleteDrink={props.handleDeleteDrink}
user={props.user}
/>
))}
</div>
</div>
);
回购:github.com/tshuldberg/coastr
解决方案
错误消息说它无法读取 的属性spirit
,undefined
这意味着您props.drink
似乎未定义。
this.state.drinks
最初有什么价值?它可能发生在第一个渲染周期中,此时this.state.drinks
仍未定义,因此您正在通过undefined
.
您是否尝试在整个组件树中输出道具的实际值?尝试将它们记录到控制台并查看您在组件中收到的实际值是什么
例如,在您的QueryItem
-Component 之前let spirit = props.drink.spirit ? (
执行此操作:
console.log(props.drink)
看看你得到了什么
推荐阅读
- r - 在R中的一个df中为多个文件的文件名添加日期
- syntax - SML 是否支持对匹配表达式中的模式进行保护?
- c++ - 使用 std::variant 而不是编译时错误在缺少函数重载时引发异常
- apache - 具有多个基于名称的虚拟主机的 2 个 Apache Web 服务器的负载平衡/高可用性
- python - 检查所有字典是否包含具有特定值的特定键
- go - 如何在 Go 中创建 HTTP 会话
- cmd - 有人可以解释一下为什么 cmd 的 'where' 找不到这个文件吗?
- algorithm - 寻找机器人驱动底座的最快路径
- python - AIOHTTP Server - 用于引发条件的 Jinja 模板
- oracle - 为什么在 Oracle 18c 上设置 MAX_DUMP_FILE_SIZE 参数时出现 ORA-44737 参数不存在?