You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

createFieldsStore.js 1.7KB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. class FieldsStore {
  2. constructor(fields = {}) {
  3. this.fields = fields
  4. }
  5. setFields(fields) {
  6. Object.assign(this.fields, fields)
  7. }
  8. updateFields(fields) {
  9. this.fields = fields
  10. }
  11. clearField(name) {
  12. delete this.fields[name]
  13. }
  14. getValueFromFields(name, fields) {
  15. const field = fields[name]
  16. if (field && 'value' in field) {
  17. return field.value
  18. }
  19. return field.initialValue
  20. }
  21. getAllFieldsName() {
  22. const { fields } = this
  23. return fields ? Object.keys(fields) : []
  24. }
  25. getField(name) {
  26. return {
  27. ...this.fields[name],
  28. name,
  29. }
  30. }
  31. getFieldValuePropValue(fieldOption) {
  32. const { name, valuePropName } = fieldOption
  33. const field = this.getField(name)
  34. const fieldValue = 'value' in field ? field.value : field.initialValue
  35. return {
  36. [valuePropName]: fieldValue,
  37. }
  38. }
  39. getFieldValue(name) {
  40. return this.getValueFromFields(name, this.fields)
  41. }
  42. getFieldsValue(names) {
  43. const fields = names || this.getAllFieldsName()
  44. return fields.reduce((acc, name) => {
  45. acc[name] = this.getFieldValue(name)
  46. return acc
  47. }, {})
  48. }
  49. resetFields(ns) {
  50. const { fields } = this
  51. const names = ns || this.getAllFieldsName()
  52. return names.reduce((acc, name) => {
  53. const field = fields[name]
  54. if (field) {
  55. acc[name] = field.initialValue
  56. }
  57. return acc
  58. }, {})
  59. }
  60. }
  61. export default function createFieldsStore(fields) {
  62. return new FieldsStore(fields)
  63. }