Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Array support #97

Open
Faithfinder opened this issue Mar 23, 2023 · 6 comments
Open

Array support #97

Faithfinder opened this issue Mar 23, 2023 · 6 comments

Comments

@Faithfinder
Copy link

Couldn't find anything about dealing with arrays in the docs. I guess there needs to be native useFieldArray support?

@iway1
Copy link
Owner

iway1 commented Apr 5, 2023

we have support for arrays, would be good to add a docs page for it though. If you create a schema with .array() you can have array values:

const StringArraySchema = z.string().array();

function StringArrayField() {
  const {field: {onChange, value}} = useTsController<string[]>();
}

const mapping = [
  [StringArraySchema, StringArrayField]
] as const

At least add examples for:

  • Dynamic text input array (allowing users to add and remove text fields)

Any other ideas of examples we'd like to see with arrays?

@Faithfinder
Copy link
Author

Faithfinder commented Apr 5, 2023

Well, the case I was trying to implement is an array of objects (or, in other words, a table). So, no, not a string array. The schema looks roughly like this:

z.object({
    data: z.object({
        id: z.string(),
        name: z.string(),
        abbr: z.string(),
        colour: z.string().nullable()
    }).array()
})

(the top-level data property is there because RHF doesn't support top-level arrays in useFieldArray)

@iway1
Copy link
Owner

iway1 commented Apr 5, 2023

you can do that as well:

const RowSchema = z.object({
        id: z.string(),
        name: z.string(),
        abbr: z.string(),
        colour: z.string().nullable()
});

const TableSchema = ObjectSchema.array();
 
function MyTable() {
   const {field: {value, onChange}} = useTsController<z.infer<typeof TableSchema>>();
 }
 
const mapping = [
  [TableSchema, MyTable],
] as const;

TBH I haven't used useFieldArray for dynamic inputs in the past, is there something that's not possible with the above approach that is possible with useFieldArray?

I guess the main motivation would be to make it easier to manipulate the dynamic inputs with things like "remove", "swap", etc? That could be done manually in the library currently, I think, but might be worth thinking about adding support for react hook forms APIs to make it easier

@Faithfinder
Copy link
Author

I see. Well, this approach makes me treat the row as a single value, which is not very ergonomic. I guess it's a different topic, but what I want, is for array and object type schemas to be associated with layout, and only ever use useTsController with primitive values.

useFieldArray is for DX, yes

@iway1
Copy link
Owner

iway1 commented Apr 6, 2023

@Faithfinder Ah I had a typo in my code, should've been typeof TableSchema which would make it so the value is an array of rows. I updated it, sry about that

@scamden
Copy link
Collaborator

scamden commented Aug 7, 2023

is for array and object type schemas to be associated with layout, and only ever use useTsController with primitive values.

if i understand you correctly this is now possible via the recursion feature #64

it might be a little more cleanly handled using this proposed FormFragment feature: #129

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants