javascript - Vue.js 使用点击事件填充模式上的表单字段值

标签 javascript vue.js

我有一个 html 模式表单,可以让我更新所选帖子。我创建了一个单击事件,用于获取所选帖子的数据,然后将其传递到表单并填充字段。我的问题是,如果使用 v-if 隐藏表单,我会收到一条错误消息:

无法读取未定义的属性“populateFormFields”

我假设这是因为该组件被隐藏,因此该功能不存在。

我想要发生的是,当在 AppSummary.vue 中单击帖子时,我希望将此帖子数据传递给 UpdateForm.vue 以填充字段,然后我想显示此表单模式。最好的方法是什么?

我的代码;

/src/components/AppSummary.vue

<template>
    <div id="summary_section">
        <h2>Summary</h2>

        <div id="summary_board">
            <div class="column">
                <div class="head">
                    <h3>Opportunities</h3>
                </div>

                <div class="body">
                    <div class="post" 
                        v-for="post in posts"
                        v-bind:key="post._id"
                        v-on:click="openUpdateForm(post)"
                    >
                        <p>{{ post._id }}</p>
                        <p class="company">{{ post.company_name }}</p>
                    </div>
                </div>
            </div>
        </div>

        <SubmitForm v-if="submitFormVisibility" v-on:formSubmitted="newFormSubmission"/>
        <UpdateForm ref="updateForm" v-if="updateFormVisibility"/>
    </div>
</template>

<script>
    import SubmitForm from './SubmitForm.vue';
    import UpdateForm from './UpdateForm.vue';
    import axios from 'axios';

    export default {
        components: {
            SubmitForm,
            UpdateForm
        },
        data() {
            return{
                posts: [],
                submitFormVisibility: false,
                updateFormVisibility: false
            };
        },
        created() {
            this.getPostData();
        },
        methods: {
            getPostData() {
                axios.get('http://localhost:5000/')
                    .then(res => {
                        const data = res.data;
                        this.posts = data;
                    })
                    .catch(error => console.log(error));
            },
            toggleSubmitFormVisibility(){
                this.submitFormVisibility = !this.submitFormVisibility;
            },
            openUpdateForm(post){
                this.updateFormVisibility = !this.updateFormVisibility;
                this.$refs.updateForm.populateFormFields(post);
            },
            newFormSubmission() {
                this.getPostData();
                this.toggleSubmitFormVisibility();
            }
        }
    }
</script>

/src/components/UpdateForm.vue

<template>
    <div id="opp_form_modal">
        <svg v-on:click="closeModal" height="25" width="25" class="close_button">
            <line x1="2" y1="2" x2="23" y2="23"></line>
            <line x1="23" y1="2" x2="2" y2="23"></line>
        </svg>

        <form @submit.prevent="SubmitOpp">
            <p>Update</p>

            <label>
                Company Name
                <input type="text" name="company_name" v-model="company_name">
            </label>

            <label>
                Company Type
                <input type="text" name="company_type" v-model="company_type">
            </label>

            <label>
                Line(s) of Business
                <select name="lines_of_business" v-model="lines_of_business">
                    <option disabled="" selected="" value="">Select Option</option>
                    <option value="Strategic Advisors">Strategic Advisors</option>
                    <option value="Strategic Sales">Strategic Sales</option>
                    <option value="Operational Support">Operational Support</option>
                    <option value="Claims Oversight">Claims Oversight</option>
                    <option value="Lead Generation">Lead Generation</option>
                    <option value="Transformation">Transformation</option>
                    <option value="Audit">Audit</option>
                    <option value="NED">NED</option>
                    <option value="Unknown at this stage">Unknown at this stage</option>
                    <option value="Other">Other</option>
                </select>
            </label>

            <label>
                Client Type
                <select name="client_type" v-model="client_type">
                    <option disabled="" selected="" value="">Select Option</option>
                    <option value="Strategic Partner">Strategic Partner</option>
                    <option value="Retained Client">Retained Client</option>
                    <option value="Multiple Projects">Multiple Projects</option>
                    <option value="Single Project">Single Project</option>
                    <option value="Other">Other</option>
                </select>
            </label>

            <label>
                Contract Type
                <select name="contract_type" v-model="contract_type">
                    <option disabled="" selected="" value="">Select Option</option>
                    <option value="Retained Monthly">Retained Monthly</option>
                    <option value="Project Fee">Project Fee</option>
                    <option value="Hourly Rate">Hourly Rate</option>
                </select>
            </label>

            <label>
                Contact Name
                <input type="text" name="contact_name" v-model="contact_name">
            </label>

            <label>
                Contact Number
                <input type="tel" name="contact_number" v-model="contact_number">
            </label>

            <label>
                Email Address
                <input type="email" name="email_address" v-model="email_address">
            </label>

            <label>
                Opportunity Owner
                <input type="text" name="opportunity_owner" v-model="opportunity_owner">
            </label>

            <label>
                Decision Maker
                <input type="text" name="decision_maker" v-model="decision_maker">
            </label>

            <label>
                Annual Jobs
                <input type="text" name="annual_jobs" v-model="annual_jobs">
            </label>

            <label>
                Average Fee
                <input type="text" name="average_fee" v-model="average_fee">
            </label>

            <label>
                Annual Value
                <input type="text" name="annual_value" v-model="annual_value">
            </label>

            <label>
                Next Steps
                <input type="text" name="next_steps" v-model="next_steps">
            </label>

            <label>
                Due Date
                <input type="date" name="due_date" v-model="due_date">
            </label>

            <button type="submit">Submit</button>
        </form>
    </div>
</template>

<script>
    //import axios from 'axios';

    export default {
        name: 'oppForm',
        data() {
            return {
                company_name: '',
                company_type: '',
                lines_of_business: '',
                client_type: '',
                contract_type: '',
                contact_name: '',
                contact_number: '',
                email_address: '',
                opportunity_owner: '',
                decision_maker: '',
                annual_jobs: '',
                average_fee: '',
                annual_value: '',
                next_steps: '',
                due_date: ''
            }
        },
        methods: {
            SubmitOpp() {
                // handle submission
            },
            populateFormFields(fieldData){
                console.log('hi');
                // console.log(fieldData);
                this.company_name = fieldData.company_name;
                this.company_type = fieldData.company_type;
                this.lines_of_business = fieldData.lines_of_business;
                this.client_type = fieldData.client_type;
                this.contract_type = fieldData.contract_type;
                this.contact_name = fieldData.contact_name;
                this.contact_number = fieldData.contact_number;
                this.email_address = fieldData.email_address;
                this.opportunity_owner = fieldData.opportunity_owner;
                this.decision_maker = fieldData.decision_maker;
                this.annual_jobs = fieldData.annual_jobs;
                this.average_fee = fieldData.average_fee;
                this.annual_value = fieldData.annual_value;
                this.next_steps = fieldData.next_steps;
                this.due_date = fieldData.due_date;
            },
            closeModal(){
                this.modalVisability = !this.modalVisability;
            }
        }
    }
</script>

最佳答案

最好的方法是直接在 props 中传递要更新的实体:

<UpdateForm :post="post" v-if="updateFormVisibility"/>

然后在 UpdateForm.vue 的 created Hook 中执行所有需要的逻辑。

请注意,您将不再需要引用,并且您的组件将不再依赖于调用函数的人。

关于javascript - Vue.js 使用点击事件填充模式上的表单字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60849169/

相关文章:

javascript - 在没有 Controller 的情况下将变量传递给 AngularJS 中的指令

javascript - 如何在 angularJS 中填充选择框?

javascript - 动态添加文件夹中的所有组件

javascript - 默认情况下,Vue 是否为 XSS 提供安全性或防止 XSS?

javascript - NuxtJS 中带有 Slug 参数的未知动态嵌套路由?

javascript - Vue js组件在没有页面刷新的情况下不渲染数据

javascript - 使用 javascript 将两个对象合而为一

javascript - Mocha/chai 断言失败,但没有差异

javascript - req.files 不工作 node.js - express

javascript - 观察vuejs中动态变化对象的变化