I am trying to write a simple tsx function component snippet. The snippet should look like this:
import * as React from 'react'
interface HomeProps {
$2
}
const Home: React.FC<HomeProps> = ({ $2 }) => {
return <div>Home</div>
}
export default Home
Let's focus on $2. All I want to achieve is that when user finish the interface, then we should get some processed $2 in function props. Something like this:
interface HomeProps{
age: number
name: string
}
const Home: React.FC<HomeProps> = ({ age, name }) => {
...
Here is my snippet code in JSON:
"TypeScript React Function Component with Props": {
"prefix": "trfp",
"body": [
"import * as React from 'react'",
"",
"interface ${1:${TM_FILENAME/(^.)(.*)\\..*/${1:/upcase}$2/}}Props {",
"\t$2",
"}"
"",
"const $1: React.FC<$1Props> = ({ ${2/(.*):.*/$1, /g} }) => {",
"\treturn $3",
"}",
"",
"export default $1"
],
"description": "TypeScript React Function Component with Props",
}
I want some help with this line:
"const $1: React.FC<$1Props> = ({ ${2/(.*):.*/$1, /g} }) => {",
With this line I can get the result like:
interface HomeProps{
age: number
name: string
}
const Home: React.FC<HomeProps> = ({ age,
name, }) => {
...
- How can I join groups in one line?
- How can I join them with comma but without trailing comma?
It takes me hours but I still can't figure it out. Can someone help?
Here is my goal:
interface HomeProps{
age: number
name: string
}
const Home: React.FC<HomeProps> = ({ age, name }) => {
...
Update
I try some conditional regex to change the line to
"const $1: React.FC<$1Props> = ({ ${2/(.*):.*(\r?\n)/$1${2:+, }/g} }) => {",
Now I can get
interface HomeProps {
key: string
val: number
}
const Index: React.FC<HomeProps> = ({ key, val: number }) => {
return
}
I also try ternary condition as described in https://code.visualstudio.com/docs/editor/userdefinedsnippets.
${2:?, :}, which means or what I want if group 2 (next line) exists, replace it with , , otherwise replace with a empty string.
However I also got the wrong result:
interface HomeProps {
key: string
val: number
}
const Index: React.FC<HomeProps> = ({ key${2:?, :}val: number }) => {
return
}
It seems like I am getting close to the answer but...
Try this snippet:
Here is where I made changes:
First, you didn't seem to be accounting for the space after the
:, so I added\\s*to the regex (\smust be double-escaped.Second, you need to match (but won't use) the newline between your entries. But your last entry won't have a newline so it is optionally captured
(\n?).Third, that optional new line is captured in group 2. After the last entry (like your
name: string) is added and you hit Tab you do not want another,added to the end. That should only be added if there is another entry - in which case there would be a newline between them.So
${2:+, }is a conditional IF. If there is a capture group 2, add,. If there is no group 2, nothing is added after group 1.I don't know if it is required but the snippet also works if there are commas after the entries, like