代码之家  ›  专栏  ›  技术社区  ›  Mr.TK

vue.js父级<->子级更新值,路由视图

  •  0
  • Mr.TK  · 技术社区  · 7 年前

    在子视图中更新父属性时出现问题。在我的情况下,参赛者是家长,编辑参赛者应该是孩子。competitor.vue应该存储(是的,可能答案就在这里-存储为vuex中的)用户信息,editcontrist应该只呈现编辑视图,允许编辑用户信息操作,并通过自己的方法或父方法保存它。我已经包括了路由,所以你应该知道我在说什么。

    结构为:

    Contestant.vue
    |-EditContestant.Vue
    

    参赛者.vue:

    <script>
        export default {
            data() {
                return {
                    contestant: {
                        id: this.$route.params.id,
                        gender: '',
                        firstname: '',
                        lastname: '',
                    },
                }
            },
        methods: {
                fetchContestant(id) {
            //some api call here                            
                  vm.updatePropContestant(res.data);
            // ...
                },
                updatePropContestant(newData) {
                    if (!this.contestant || this.contestant.length === 0) {
                        this.contestant = {};
                    }
                    this.contestant.firstname = newData.firstname;
                    this.contestant.lastname = newData.lastname;
                    this.contestant.id = newData.id;
                    this.contestant.gender = newData.gender;
                    // this.$forceUpdate();
                },
            },
            }
    </script>
    <template>
        <div>
            <router-view :contestant="contestant"  @interface="contestant = $event"></router-view>
        </div>
    </template>
    

    编辑竞争者.vue

    <script>
        export default {
            data() {
                console.log('data');
                return {
                    editContestant: {
                        id: '',
                        'firstname': '',
                        'lastname': '',
                        'gender': 0
                    },
                    edit: false
                }
            },
            props: ['contestant'],
            created: function () {
    // tried also to fetchContestant if parent beforeCreate method with same result, so tried moving it here :(
                this.$parent.fetchContestant(this.$route.params.id);
            }
        }
    </script>
    
    <template>
    <div class="col">
    <input id="firstname" v-model="this.$parent.contestant.firstname" type="text" class="form-control"                                placeholder="First name" 
    <!-- this doesn't help either v-on:input="updateParentValue($event.target.value)" --> >
                    </div>
    </template>
    

    App.JS

    require('./bootstrap');
    window.Vue = require('vue');
    import router from './router';
    new Vue({
        el: "#app",
        router,
        // render: h => h(app)
    });
    
    

    路由器/索引.js

    
    import contestantComponent from '../components/Contestant/Contestant'
    import contestantEditComponent from '../components/Contestant/EditContestant'
    Vue.use(Router)
    export default new Router({
        routes: [
            {
                path: '/contestant/:id',
                component: contestantComponent,
                children: [
                    {
    
                        name: 'Contestant edit',
                        component: contestantEditComponent,
                        path: '/contestant/:id?/edit',
                    },
                    {
                        name: 'View contestant',
                        component: ViewContestantComponent,
                        path: '',
                    }
                ],
        ]
    })
    

    当我向输入中添加某些内容时,会得到一个错误:

    
    found in
    
    ---> <EditContestant> at resources/js/components/Contestant/EditContestant.vue
           <Contestant> at resources/js/components/Contestant/Contestant.vue
             <Root>
    warn @ app.js:41366
    logError @ app.js:42625
    globalHandleError @ app.js:42620
    handleError @ app.js:42580
    invokeWithErrorHandling @ app.js:42603
    invoker @ app.js:42916
    original._wrapper @ app.js:48273
    

    app.js:42629 TypeError: Cannot read property '$parent' of null
        at _c.on.input (app.js:37434)
        at invokeWithErrorHandling (app.js:42595)
        at HTMLInputElement.invoker (app.js:42916)
        at HTMLInputElement.original._wrapper (app.js:48273)
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   Cloud Soh Jun Fu    7 年前

    你不需要 this. 在模板中,只需使用 $parent . 模板已在 这个。 范围。

    父母和孩子之间的交流应该使用 Props down events up ,而不是直接通过 this.$parent.function() . 你应该 $emit('callFunc') 然后 @callFunc="function" .

        2
  •  0
  •   Mr.TK    7 年前

    去除 this this.$parent... 在editContentAtn.vue文件中有帮助。多谢您对云索俊夫的帮助。如果你想回答我的问题,我很乐意接受你的回答,并删除我自己的。

    推荐文章