为啥点击路线时会修改道具?

Posted

技术标签:

【中文标题】为啥点击路线时会修改道具?【英文标题】:Why are props being modified when clicking on a route?为什么点击路线时会修改道具? 【发布时间】:2020-11-15 12:19:17 【问题描述】:

我从摘要页面上的这两个链接开始。

我将点击第一个链接,一切正常显示,我不做任何更改并点击主页链接。

这是我的控制台日志:

但是,当我单击第二个链接并单击主页按钮而不进行任何更改时,我的牛奶和奥利奥的 uuid 正在更改。

我的 redux 状态是正确的,所以我知道我的状态没有被修改。

我的与Summary Page显示相关的组件是MealList和MealItem组件:

import React from 'react';
import  connect  from 'react-redux'
import MealItem from './MealItem'

const MealList = (props) => 
    return (
        <div>
            props.meals.length === 0 ? (
                <div>
                    <span>No Meals</span>
                </div>
            ) : (
                    props.meals.map(meal =>
                        <MealItem key=meal.uuid ...meal />
                    )
                )
        </div>
    );


const mapStateToProps = state => (
    meals: state.meals
)

export default connect(mapStateToProps)(MealList);

还有:

import React from 'react';
import  Link  from 'react-router-dom'



const MealItem = (props) => 
    console.log(props.uuid);
    console.log(props);
    return (
        <div>
            <Link to=`/edit/$props.uuid`>
                <h1>props.foodItem</h1>
            </Link>
            <h3>props.calories</h3>
        </div>
    );




export default MealItem

呈现 EditMealPage 的页面是:

import React,  Component  from 'react';
import  connect  from 'react-redux'
import  editServing  from './actions/meal';

class EditMealPage extends Component 
    constructor(props) 
        super(props)
        this.state = 
            uuid: this.props.meal.uuid,
            foodId: this.props.meal.foodId,
            measureURI: this.props.meal.measureURI,
            quantity: this.props.meal.quantity,
            mealCategory: this.props.meal.mealCategory
        
    

    onMeasureChange = e => (this.setState( measureURI: e.target.value ))
    onQuantityChange = e => (this.setState( quantity: e.target.value ))
    onMealCategoryChange = e => (this.setState( mealCategory: e.target.value ))

    onSubmit = e => 
        e.preventDefault()
        const  foodId, measureURI, quantity, uuid, mealCategory  = this.state
        const editsObj = 
            foodId,
            measureURI,
            quantity: parseInt(quantity)
        
        this.props.editServing(uuid, editsObj, mealCategory)

    

    render() 
        const  foodItem, calories, measures  = this.props.meal
        const  measureURI, quantity, mealCategory  = this.state
        return (
            <div>
                <h1>Edit Meal</h1>
                <h3>foodItem</h3>
                <h3>calories</h3>
                <div>
                    <form onSubmit=this.onSubmit>
                        <select
                            value=measureURI
                            onChange=this.onMeasureChange>
                            measures.map((measure, i) => <option key=i value=measure.uri>measure.label</option>)
                        </select>
                        <input
                            value=quantity
                            onChange=this.onQuantityChange
                            type="text"></input>
                        <select value=mealCategory
                            onChange=this.onMealCategoryChange>
                            <option value='breakfast'>Breakfast</option>
                            <option value='lunch'>Lunch</option>
                            <option value='dinner'>Dinner</option>
                            <option value='snack'>Snack</option>
                        </select>
                        <button type="submit">Edit Meal</button>
                    </form>
                </div>
            </div>
        )
    



const mapStateToProps = (state, props) => (
    meal: state.meals.find(meal => meal.uuid = props.match.params.uuid)
)

const mapDispatchToProps = dispatch => (
    editServing: (uuid, fetchObj, mealCategory) => dispatch(editServing(uuid, fetchObj, mealCategory))
)
export default connect(mapStateToProps, mapDispatchToProps)(EditMealPage)

我不知道为什么我的 uuid 属性被修改了。看来这是唯一被修改的道具,在我的路由文件中,uuid 是我使用的唯一参数&lt;Route path='/edit/:uuid' component=EditMealPage /&gt;我做错了什么?

如果需要,GitHub 存储库的链接是 https://github.com/altafmquadri/caloriEat。

【问题讨论】:

您应该使用 react-router 提供的匹配对象访问您的 uuid 参数。您可以使用 withRouter hoc 包装您的 EditMealPage.js 组件,然后访问匹配属性。 【参考方案1】:

很难用这些代码来判断这里发生了什么(我们可能也需要减速器)所以我冒昧地下载了你的 repo 并在本地尝试它(包括在你的 API 中创建一个 API 密钥) '用来取回食物)。

话虽如此,在本地测试之后,我发现了问题,它是……一个错字!

结帐this line

const mapStateToProps = (state, props) => (
    meal: state.meals.find(meal => meal.uuid = props.match.params.uuid)
)

让我们仔细看看 find... 中的箭头函数...您正在执行分配而不是等于。 (====

替换为

meal => meal.uuid === props.match.params.uuid

会解决你的问题

【讨论】:

感谢您抽出时间来设置一切以帮助调试。 没问题!我认为问题出在减速器上。最终,我找到了错字,但原来那部分代码已经在问题中了。【参考方案2】:

我想我找到了。如果不是达尼洛的评论,我不会检查。这是一个典型的错误,通常很难发现:

const mapStateToProps = (state, props) => (
    meal: state.meals.find(meal => meal.uuid = props.match.params.uuid)
)

您将props.match.params.uuid 的值与= 分配给meal.uuid,而您只想检查与=== 的相等性。

【讨论】:

以上是关于为啥点击路线时会修改道具?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SASS 在使用扩展时会修改同名的链式选择器?

为啥在修改引用的程序集时会重建其他程序集?

请问谁有魔兽世界单机的人物和道具属性修改器

Vue.js。子组件中的变异道具不会触发警告。想知道为啥

为啥我的 Vue js 应用在路由到其他组件时会失去焦点?

为啥航点示例代码的这种修改失败?