javascript - VueJS组件系统架构

标签 javascript vue.js vuejs2 vue-component vuex

我想要完成的事情

我正在尝试为我正在处理的应用程序找出一个好的架构。

如果你看一些screenshots of the current version of our application您会看到各种格式的表格/数据列表。第二张截图中的表格有自己的导航。在某些情况下,可以选择表格行。在其他屏幕中,可以根据指定的关键字过滤项目列表,等等。

前端将在 VueJS 中重建。我不想为每个特定屏幕构建一次性组件,而是希望有一个更通用的解决方案,我可以在整个应用程序中使用。

我需要的是一个组件系统,其中根组件包含一组数据,子组件提供(可能是多个)该数据的表示。根组件还包含——主要是用户指定的——用于控制表示的配置、过滤器和选择。

some pseudocode 最好地说明了我要实现的目标.

问题

存储数据的最佳方式是什么?子组件应该如何访问这些数据?

data-display 的数据连同 Prop 传递给它的每个 child 对我来说似乎很麻烦。特别是因为表示可以隐式访问此数据。

我应该为此使用 Vuex 吗?这将如何处理 data-display 的多个实例?我读了一些关于动态模块注册的内容,这有用吗?

有没有更好的方法?非常感谢任何帮助!

最佳答案

我不确定我是否掌握了您要求的所有细节,但了解数据在 SPA 中的多个“页面”中是通用的。 我肯定会推荐 Vuex:

  • 所有页面的数据相同
  • 通过组件计算属性访问, 它们对存储更改有反应,但也缓存以保存 如果依赖关系没有变化则重新计算
  • 在 Prop (向下传递)和事件(向上传递)中保存大量潜在的复杂数据传递

查看伪代码,侧边栏上有三种类型的过滤器。将该数据也放入存储中,然后 View 上的计算属性可以对数据应用过滤器。然后可以轻松地单独测试计算逻辑。

child.vue

<template>
  <div>{{ myChildData.someProperty }}</div>
</template>

<script>
export default {
  props: [...],
  data: function () {
    return {
      selection: 'someValue'  // set this by, e.g, click on template
    }
  },
  computed: {
    myChildData() {
      return this.$store.getters.filteredData(this.selection)
    }
  }
}
</script>

store.js

const state = {
  myData: {
    ...
  },
  filters: {  // set by dispatch from sidebar component
    keyword: ...,
    toggle: ...,
    range: ...
  },
}

const getters = {
  filteredData: state => {
    return childSelection => {  // this extra layer allows param to be passed
      return state.myData
       .filter(item => item.someProp === state.filters.keyword)
       .filter(item => item.anotherProp === childSelection)
    }
  },
}

const mutations = {
  'SET_DATA' (state, payload) {
    ...
  },
  'SET_FILTER' (state, payload) {
    ...
  }
}

export default {
  state,
  getters,
  mutations,
}

一般 child

可能有很多方法可以解决这个问题。我使用了组合,这意味着每个 child 都有一个精简组件,每个 child 都使用一个公共(public)组件,但只有当 child 有特定数据或一些可以放入槽中的独特标记时,你才需要这个。

child1.vue

<template>
  <page-common :childtype="childType">
    <button class="this-childs-button" slot="buttons"></button>
  </page-common>
</template>

<script>
import PageCommon from './page-common.vue'
export default {
  props: [...],
  data: function () {
    return {
      childType: 'someType'
    }
  },
  components: {
    'page-common': PageCommon,
  }
}
</script>

page-common.vue

<template>
  ...
  <slot name="buttons"></slot>
</template>

<script>
export default {
  props: [
    'childtype'
  ],
  data: function () {
    return {
      ...
    }
  },
}
</script>

多个数据实例

同样,有很多变体——我使用了一个带有属性的对象作为索引,所以存储变成了

store.js

const state = {
  myData: {
    page1: ...,  // be sure to explicitly name the pages here
    page2: ...,  // otherwise Vuex cannot make them reactive
    page3: ...,
  },
  filters: {  // set by dispatch from sidebar component
    keyword: ...,
    toggle: ...,
    range: ...
  },
}

const getters = {
  filteredData: state => {
    return page, childSelection => {  // this extra layer allows param to be passed
      return state.myData[page]  // sub-select the data required
       .filter(item => item.someProp === state.filters.keyword)
       .filter(item => item.anotherProp === childSelection)
    }
  },
}

const mutations = {
  'SET_DATA' (state, payload) {
    state.myData[payload.page] = payload.myData
  },
  'SET_FILTER' (state, payload) {
    ...
  }
}

export default {
  state,
  getters,
  mutations,
}

关于javascript - VueJS组件系统架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46302459/

相关文章:

JavaScript:如何在 for 循环期间跳过数组中的当前项? (继续?)

javascript - 在 Backbone.js 中使用 Jade 模板

javascript - JQuery 返回 2 个不同的 ID

javascript - 如何从另一个组件Vue获取组件的HTML元素

javascript - 如何将数据从vue组件传递到laravel中的 View (HTML)

vue.js - 无法使用 Vue-Chartjs(或任何其他插件)触发 beforeDraw

vue.js - Vue 3 中组织注册Vue全局组件

javascript - 获取以前的 URL 以用于重定向

javascript - Javascript 中的多个全局变量

css - Vue 组件中的响应式 Prop