首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用组件区域显示各种内容

使用组件区域显示各种内容
EN

Stack Overflow用户
提问于 2018-05-25 12:39:41
回答 2查看 76关注 0票数 0

我有一个相对简单的任务,虽然我只是一个初学者,所以很难继续下去。我在左边有一个用户列表,右边有一个面板来显示用户的信息。关于用户的信息有一个编辑按钮,我想要接管该右面板,然后保存将返回到用户详细信息。做这件事最好的方法是什么?这两个页面应该是不同的组件,还是我应该只使用javascript来显示和隐藏内容?有没有比这两个更好的方法呢?对不起,我是新来的,只是想弄明白这个概念。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-25 14:20:47

我为你写了一个简单的例子:

代码语言:javascript
复制
const data = [{
  id: 1,
  name: 'user1',
  age: 21
},{
  id: 2,
  name: 'user2',
  age: 33
}]

const mixin = {
  props: {
    userId: {
      required: true
    }
  },
  data () {
    return {
      user: {}
    }
  },
  methods: {
    loadUser () {
      /*ajax to get user detail data here*/
      setTimeout(_=>{
        this.user = data.filter(o=>o.id==this.userId)[0]
      },10)
    }    
  },
  created () {
    this.loadUser()
  },
  watch: {
    userId (newVal) {
      if(newVal){
        this.loadUser()
      }
    }
  }
}

Vue.component('user-viewer',{
  template: `<div>
    name:{{user.name}}<br>
    age: {{user.age}}<br>
    <button @click="edit">edit</button>
  </div>`,
  mixins: [mixin],
  methods: {
    edit () {
      this.$emit('switch-edit-mode',true)
    }
  }
});

Vue.component('user-editor',{
  template: `<div>
    name:<input type="text" v-model="user.name"><br>
    age: <input type="text" v-model="user.age"><br>
    <button @click="sendData">save</button>
  </div>`,
  mixins: [mixin],
  methods: {
    sendData () {
      /*ajax send user data here*/
      setTimeout(_=>{
        /*false means edit complete,so that user list must be reloaded*/
        this.$emit('switch-edit-mode',false);
      },10)
    }
  }
});

var app = new Vue({
  el: '#app',
  data () {
    return {
      users: [],
      isModify: false,
      userId: null
    }
  },
  methods: {
    toggleModify (modify) {
       this.isModify = modify
       if(!modify){
          this.fetchUsers();
       }
    },
    fetchUsers () {
      /*load your user list data here*/
      this.users = data.map(o=>({
        id: o.id,
        name: o.name
      }))
    }
  },
  created () {
    this.fetchUsers()
  }
})
代码语言:javascript
复制
*{
    padding:0;
    margin:0;
  }
  ul,li{
    list-style:none;
  }
  .main{
    display: flex;
  }
  .user-list{
    width: 250px;
  }
  .user-list>li{
    border:1px solid skyblue;
    border-bottom: none;
  }
  .user-list>li:last-child{
    border-bottom:1px solid skyblue;
  }
  .content-wrapper{
    flex:1;
  }
代码语言:javascript
复制
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<style>
  *{
    padding:0;
    margin:0;
  }
  ul,li{
    list-style:none;
  }
  .main{
    display: flex;
  }
  .user-list{
    width: 250px;
  }
  .user-list>li{
    border:1px solid skyblue;
    border-bottom: none;
  }
  .user-list>li:last-child{
    border-bottom:1px solid skyblue;
  }
  .content-wrapper{
    flex:1;
  }
</style>
<div id="app">
  <div class="main">
    <ul class="user-list">
      <li v-for="user in users" @click="userId=user.id">{{user.name}}</li>
    </ul>
    <div class="content-wrapper">
      <component v-if="userId" :is="isModify?'user-editor':'user-viewer'" @switch-edit-mode="toggleModify" :user-id="userId"></component>
      <div v-else>please choose a user to view or edit</div>
    </div>
  </div>
</div>

票数 1
EN

Stack Overflow用户

发布于 2018-05-28 09:25:52

你的混合文件:(mixin.js)

代码语言:javascript
复制
export default{
  props: {
    userId: {
      required: true
    }
  },
  data () {
    return {
      user: {}
    }
  },
  methods: {
    loadUser () {
      /*ajax to get user detail data here*/
      setTimeout(_=>{
        this.user = data.filter(o=>o.id==this.userId)[0]
      },10)
    }    
  },
  created () {
    this.loadUser()
  },
  watch: {
    userId (newVal) {
      if(newVal){
        this.loadUser()
      }
    }
  }
}

用法:

代码语言:javascript
复制
import mixin from 'mixin.js'
export default{
  ...
  mixins: [mixin]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50521657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档