Объекты становятся пустыми в компоненте VueJS - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать приложение в VueJS, где у меня есть компонент, похожий на этот:

<template>
    <div>
        <base-subheader title="Members" icon="la-home" heading="Member Details" description="Home"></base-subheader>
        <div class="m-content">
            <div class="row">
                <div class="col-xl-6">
                    <nits-form-portlet
                            title="Add Member/User"
                            info="Fill the details below to add user, fields which are mandatory are label with * (star) mark."
                            headIcon="flaticon-multimedia"
                            headerLine
                            apiUrl="api/user"
                            backUrl="members__home"
                            action="create"
                            :formElements="form_elements"
                    >
                    </nits-form-portlet>
                </div>
                <div class="col-xl-6">
                </div>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        name: "member-add",
        data() {
            return {
                form_elements: [
                    {
                        field_name: 'first_name',
                        config_elements: {
                            label: 'First Name *',
                            type: 'text',
                            inputStyle: 'pill',
                            placeholder: 'Enter first name of user',
                            formControl: true,
                            addonType: 'left-icon',
                            addon: {leftAddon: 'la-exclamation'},
                        },
                        value: '',
                        nitsFormType: 'nits-input'
                    },
                    {
                        field_name: 'last_name',
                        config_elements: {
                            label: 'Last Name',
                            type: 'text',
                            inputStyle: 'pill',
                            placeholder: 'Enter last name of user',
                            formControl: true,
                            addonType: 'left-icon',
                            addon: {leftAddon: 'la-exclamation'},
                        },
                        value: '',
                        nitsFormType: 'nits-input'
                    },
                    {
                        field_name: 'email',
                        config_elements: {
                            label: 'Email *',
                            type: 'email',
                            inputStyle: 'pill',
                            placeholder: 'Enter email of user',
                            formControl: true,
                            addonType: 'left',
                            addon: {leftAddon: '@'},
                        },
                        value: '',
                        nitsFormType: 'nits-input'
                    },
                    {
                        field_name: 'password',
                        config_elements: {
                            label: 'Password *',
                            type: 'password',
                            inputStyle: 'pill',
                            placeholder: 'Enter password',
                            formControl: true,
                            addonType: 'left-icon',
                            addon: {leftAddon: 'la-expeditedssl'},
                        },
                        value: '',
                        nitsFormType: 'nits-input'
                    },
                    {
                        field_name: 'confirm_password',
                        config_elements: {
                            label: 'Confirm Password *',
                            type: 'password',
                            inputStyle: 'pill',
                            placeholder: 'Confirm password should match',
                            formControl: true,
                            addonType: 'left-icon',
                            addon: {leftAddon: 'la-expeditedssl'},
                        },
                        value: '',
                        nitsFormType: 'nits-input'
                    },
                    {
                        field_name: 'role',
                        config_elements: {
                            label: 'Select Role *',
                            inputStyle: 'pill',
                            options: [
                                {option: 'Select one'},
                                {value: '1', option: 'Admin'},
                                {value: '2', option: 'Subscriber'},
                                {value: '3', option: 'Analyst'},
                                {value: '4', option: 'Guest'}
                            ],
                            addonType: 'left-icon',
                            addon: {leftAddon: 'la-user-secret'},
                        },
                        value: '',
                        nitsFormType: 'nits-select'
                    },
                    {
                        field_name: 'profile_pic',
                        config_elements: {
                            label: 'Profile pic',
                        },
                        value: '',
                        nitsFormType: 'nits-file-input'
                    }
                ],
            }
        }
    }
</script>

<style scoped>

</style>

Всякий раз, когда я пытаюсь передать данные в мой компонент config_elements, который содержит объект всех атрибутов, передаваемых дочернему компоненту, теряется, если я перехожу из другого компонента в nits-form-portlet>, он соответствующим образом отображает дочерние компоненты, но в моем Vue-debug tool показывает пустой:

enter image description here

Но компоненты отображаются правильно:

enter image description here

И то же самое происходит с подпорками внутри компонента:

enter image description here

Но в случае какого-либо события или обновления страницы отображается:

enter image description here

Поскольку все атрибуты исчезли, если я попытаюсь настроить данные объекта config_elements, я получу атрибуты, но в течение доли секунды он снова станет пустым. Но атрибуты передаются и отображаются поля:

enter image description here

Я использую функцию рендеринга для рендеринга этих компонентов, поэтому для nits-form-portlet компонента у меня есть:

return createElement('div', { class: this.getClasses() }, [
    createElement('div', { class: 'm-portlet__head' }, [
        createElement('div', { class: 'm-portlet__head-caption' }, [element])
    ]),
    createElement('form', { class: 'm-form m-form--fit m-form--label-align-right' }, [
        createElement('div', { class: 'm-portlet__body' }, [
            createElement('div', { class: 'form-group m-form__group m--margin-top-10' }, [infoElement]),
            this.computedFormElements.map(a => {
                if(this.error[a.field_name]) {
                    a.config_elements.error = this.error[a.field_name][0];
                    return createElement(a.nitsFormType, { attrs: a.config_elements, on: {
                        input: (event) => {
                            this.form[a.field_name] = event
                        }
                    }})
                }
                else
                    return createElement(a.nitsFormType, { attrs: a.config_elements, on: {
                        input: (event) => {
                            this.form[a.field_name] = event
                        }
                    }})
            })
        ]),
        footerElement
    ])
])

И я думаю, что факторы, влияющие на шаблон, - это утверждение карты:

this.computedFormElements.map(a => {
    if(this.error[a.field_name]) {
        a.config_elements.error = this.error[a.field_name][0];
        return createElement(a.nitsFormType, { attrs: a.config_elements, on: {
            input: (event) => {
                this.form[a.field_name] = event
            }
        }})
    }
    else
        return createElement(a.nitsFormType, { attrs: a.config_elements, on: {
            input: (event) => {
                this.form[a.field_name] = event
            }
        }})
})

но все же я делюсь всем своим кодом функции рендеринга, Ссылка на код @ github в надежде, что кто-то может помочь мне в этой странной ситуации.

1 Ответ

0 голосов
/ 12 января 2019

Мне сложно сказать без запуска кода, но я заметил кое-что, что может быть связано.

Я вижу, что вы перезаписываете formElements реквизит здесь:

a.config_elements.error = this.error[a.field_name][0];

Vue обычно предупреждает вас, что вы не можете этого сделать, но, возможно, из-за того, что он абстрагируется от вычислений, он этого не делает.

Если вы хотите расширить данные для использования в дочернем компоненте, то лучше всего сделать копию объекта (предпочтительно глубокую копию с использованием computed, что позволит вам динамически обновлять ее)

, поскольку config_elements является объектом, при добавлении переменной error вы, вероятно, запускаете наблюдателя, который может очищать данные в родительском объекте.

В любом случае, это всего лишь предположение, но что-то, что вы можете решить в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...