如何在 VueJS 中连接/修改道具

Posted

技术标签:

【中文标题】如何在 VueJS 中连接/修改道具【英文标题】:How to concatenate/modify props in VueJS 【发布时间】:2021-10-14 02:55:15 【问题描述】:

我正在尝试在Vue2 中构建一个应用程序我有一个父组件,我在其中使用v-for 将数据作为道具传递给子组件。

这是我的父组件:

<template>
    <div class="row" v-for="(item, index) in variables">
        <design-arch :details="item" :selectedFields="selectedFields"></design-arch>
    </div>
</template>

props:['selectedFields'],

data() 
    return 
        variables:[
            id: 1, role: 2, specialisation: 13, name: 'ABC - spec 1', role_name: 'ABC', spec_name: 'spec 1',
            id: 2, role: 2, specialisation: 24, name: 'ABC - spec 2', role_name: 'ABC', spec_name: 'spec 2',
            id: 3, role: 2, specialisation: 27, name: 'ABC - spec 3', role_name: 'ABC', spec_name: 'spec 3',
        ]
    

    

下面是我的子组件:

<template>
    <table v-if="tableData && tableData.data.length">
        <thead class="">
            <tr>
                <th>Sr No</th>
                <th>Projects Count</th>
                <th>Value</th>
                <th>Area</th>
            </tr>
        </thead>
        <tbody>
            <tr v-for="(item,index) in tableData.data">
                <td>tableData.meta.from + index</td>
                <td>item.projects_count</td>
                <td>item.value</td>
                <td>item.area</td>
            </tr>
        </tbody>
    </table>
</template>

props: ['details', 'selectedFields'],

data()
    return
        loading: false,
        tableData:,
        filters: '',
    
,

methods:
    fetchData()
        this.filters = this.selectedFields;
        this.filters['role'] = typeof this.selectedFields['role'] !== 'undefined' ? this.selectedFields['role'] : [id: this.details.role, name: this.details.role_name];
        this.filters['specialisation'] = typeof this.selectedFields['specialisation'] !== 'undefined' ? this.selectedFields['specialisation'] : [id: this.details.specialisation, name: this.details.spec_name];
        this.filters['sort_by_column'] = typeof this.selectedFields['sort_by_column'] !== 'undefined' ? this.selectedFields['sort_by_column'] :  column: 'projects_count', order: 'desc';

        console.log(this.filters)
        
        //axios call... with payload as this.filters
    
,
    

在上面的代码中,我们需要连接或修改 prop - selectedFields 并调用 API 来获取数据。由于每个组件都有特定的修改,我们需要在子组件中重新计算。

目前我的过滤器在每个子组件中都是相似的,并且在 Axios 调用期间不会反映修改。

我们如何修改本地数据中的 props 元素。这样我们就可以有不同的执行。

感谢任何更好的方法。谢谢。

【问题讨论】:

您在父组件上尝试过:selectedFields.sync="selectedFields" 吗? 【参考方案1】:

我建议在道具 details 上添加一个 Vue watch。任何时候details 更改它都会重新运行fetchData()。见Vue watch。

watch: 
  details: 
    immediate: true,
    deep: true,
    handler (oldValue, newValue) 
      this.fetchData()
    
  

【讨论】:

以上是关于如何在 VueJS 中连接/修改道具的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs:如何在异步导入加载中设置道具值?

如何在VueJS中将动态鼠标滚动值作为道具传递

如何使用道具 vuejs 在子组件中打开和关闭模式?

VueJS 功能组件(SFC):如何封装代码?

如何在 vuejs 中通过 <router-link /> 将道具传递给命名视图?

Vuejs 2将道具对象传递给子组件并检索