【问题标题】:How to send data one component to another after button click Vuejs按钮单击Vuejs后如何将数据发送到另一个组件
【发布时间】:2017-09-27 05:17:10
【问题描述】:

我有两个组件,一个是用户组件,用户组件内部有编辑用户组件(模态框),所以我的问题是如何在单击编辑用户按钮后将用户对象传递给编辑用户组件。

用户视图

<div>
    <v-layout row wrap>
        <v-flex sm3 xs2 v-for="user in users">
            <v-card>
                <v-card-media src="https://vuetifyjs.com/static/doc-images/cards/plane.jpg"
                              height="200px">
                </v-card-media>
                <v-card-title primary-title>
                    <div>
                        <h3 class="headline mb-0">{{user.name}}</h3>
                        <div><b>Email : </b>{{user.email}}</div>
                    </div>
                </v-card-title>
                <v-card-actions>
                    <v-spacer></v-spacer>
                    <v-btn primary dark @click="editUser(user)">Edit</v-btn>
                    <v-btn error dark>View</v-btn>
                </v-card-actions>
            </v-card>
        </v-flex>
    </v-layout>

    <edit-modal></edit-modal>

</div>

编辑模式

<v-layout row justify-center>
    <v-dialog persistent width="30%">
        <v-card>
            <v-card-title>
                <span class="headline">User Profile</span>
            </v-card-title>
            <v-card-text>
                <v-container grid-list-md>
                    <v-layout wrap>
                        <v-flex xs12 sm6 md12>
                            <v-text-field label="Legal first name" required></v-text-field>
                        </v-flex>
                        <v-flex xs12 md6>
                            <v-text-field label="Email" required ></v-text-field>
                        </v-flex>
                    </v-layout>
                </v-container>
                <small>*indicates required field</small>
            </v-card-text>
            <v-card-actions>
                <v-spacer></v-spacer>
                <v-btn light @click.native="dialog">Close</v-btn>
                <v-btn primary @click.native="saveUser">Save</v-btn>
            </v-card-actions>
        </v-card>
    </v-dialog>
</v-layout>

Screen shot

【问题讨论】:

    标签: javascript components vuejs2 prop


    【解决方案1】:

    你可以做的是最初在用户组件中定义一个空的用户模型,就像虚拟对象一样,并将其作为道具传递给编辑模态组件并使用 v-if 隐藏和显示模型:

    <edit-modal v-if="isShowModel" :userObj="userObj"></edit-modal>
    

    在脚本部分:

    data() {
       return {
          userObj: {
              name: '',
              email: ''
          },
          isShowModel: false
       }
    },
    methods: {
      editUser(user) {
        this.userObj.name = user.name;
        this.userObj.email = user.email;
        this.isShowModel = true;
      }
    }
    

    在编辑组件中使用道具访问它:

    props:['userObj'],
    data() {
      return {
        newUserObj: Object.assign({}, this.userObj),
      }
    }
    

    这会奏效。但是还有另一种方法可以使用 $refs 给编辑模态一个 ref 属性:

    <edit-modal ref="editme"></edit-modal>
    

    然后在脚本部分访问这个参考:

    methods: {
      editUser(user) {
        this.$refs.editme.name = user.name;
        this.$refs.editme.email = user.email;
      }
    }
    

    在编辑组件中,在 data() 中定义名称和电子邮件

    data() {
        return {
           name: '',
           email: ''
        }
    }
    

    现在要更新父组件中那些已编辑的值,您可以使用 $emit:

    <v-btn primary @click.native="saveUser">Save</v-btn>
    

    在脚本中:

    methods: {
      saveUser() {
        this.$emit('onEditValue', this.name, this.email);
      }
    }
    

    在父组件中:

    <edit-modal
      ref="editme"
      @onEditValue="editCall"
    ></edit-modal>
    

    在脚本中:

    methods: {
      editCall(name, email) {
        this.user.name = name;
        this.user.email = email;
      }
    }
    

    【讨论】:

    • 它工作正常。但不符合我的要求。我想避免父数据更改..(我从模态框实时更新父视图更改值)观看:{编辑:函数(nv,ov){this.func = nv}},
    • 好的,所以您也想将这些更新的值传递给父组件。明白了,我会更新我的代码。
    • 没有。我不想将编辑过的数据发送给父母。我想避免父数据更改。检查我附上的图片
    • 在这种情况下,您的子 data() 复制了从父 userObj 传递的道具:Object.assign({}, this.userObjFromProps),这样就可以了
    • 相应地更新了我的答案
    【解决方案2】:

    如果两个组件是兄弟组件,可以使用Vuejs提供的Event Bus

    Reference Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多