# Snippets
## Snippets info
Snippet bodies preserve the spacing shown below; spaces inside braces and parentheses do not automatically create new lines.
`$` represent each step after `tab`.
_TypeScript_ has own components and own snippets. Use search or just type `ts` before every component snippet.
I.E. `tsrcc`
### React Hooks
| Prefix | Method |
| ----------------------------: | ------------------------------------------------------------------ |
| `useStateSnippet→` | `const [state, setState] = useState(initialValue)` |
| `useEffectSnippet→` | `useEffect` with cleanup function and dependency array |
| `useContextSnippet→` | `const value = useContext(MyContext)` |
| `useReducerSnippet→` | `const [state, dispatch] = useReducer(reducer, initial, init)` |
| `useCallbackSnippet→` | `useCallback` with dependency array |
| `useMemoSnippet→` | `useMemo` with dependency array |
| `useRefSnippet→` | `const ref = useRef(initialValue)` |
| `useImperativeHandleSnippet→` | `useImperativeHandle` with ref and factory |
| `useLayoutEffectSnippet→` | `useLayoutEffect` with cleanup and dependency array |
| `useIdSnippet→` | `const id = useId()` (React 18+) |
| `useTransitionSnippet→` | `const [isPending, startTransition] = useTransition()` (React 18+) |
| `useDeferredValueSnippet→` | `const deferred = useDeferredValue(value)` (React 18+) |
| `useSnippet→` | `const value = use(resource)` (React 19+; Promises or Context) |
| `useActionStateSnippet→` | `useActionState` async handler (React 19+) |
| `useFormStatusSnippet→` | `useFormStatus()` (React 19+, from `react-dom`) |
| `useOptimisticSnippet→` | `useOptimistic` with state and updater function (React 19+) |
### Basic Methods
| Prefix | Method |
| ------: | ---------------------------------------------------- |
| `imp→` | `import moduleName from 'module'` |
| `imn→` | `import 'module'` |
| `imd→` | `import { destructuredModule } from 'module'` |
| `ime→` | `import * as alias from 'module'` |
| `ima→` | `import { originalName as aliasName} from 'module'` |
| `exp→` | `export default moduleName` |
| `exd→` | `export { destructuredModule } from 'module'` |
| `exa→` | `export { originalName as aliasName} from 'module'` |
| `enf→` | `export const functionName = (params) => { }` |
| `edf→` | `export default (params) => { }` |
| `ednf→` | `export default function functionName(params) { }` |
| `met→` | `methodName = (params) => { }` |
| `fre→` | `arrayName.forEach(element => { })` |
| `fof→` | `for(let itemName of objectName) { }` |
| `fin→` | `for(let itemName in objectName) { }` |
| `anfn→` | `(params) => { }` |
| `nfn→` | `const functionName = (params) => { }` |
| `dob→` | `const {propName} = objectToDescruct` |
| `dar→` | `const [propName] = arrayToDescruct` |
| `sti→` | `setInterval(() => { }, intervalTime)` |
| `sto→` | `setTimeout(() => { }, delayTime)` |
| `prom→` | `return new Promise((resolve, reject) => { })` |
| `pge→` | `get propertyName() { return this.backingProperty }` |
| `pse→` | `set propertyName(value) { }` |
| `tpf→` | `typeof operand` |
| `cmmb→` | `comment block` |
| `cp→` | `const { } = this.props` |
| `cs→` | `const { } = this.state` |
### React
| Prefix | Method |
| ----------: | ------------------------------------------------------------------------------ |
| `imr→` | `import React from 'react'` |
| `imrd→` | `import ReactDOM from 'react-dom'` |
| `imrc→` | `import { Component } from 'react'` |
| `imrcp→` | `import { Component } from 'react'` + `import PropTypes from 'prop-types'` |
| `imrpc→` | `import { PureComponent } from 'react'` |
| `imrpcp→` | `import { PureComponent } from 'react'` + `import PropTypes from 'prop-types'` |
| `imrm→` | `import { memo } from 'react'` |
| `imrmp→` | `import { memo } from 'react'` + `import PropTypes from 'prop-types'` |
| `imrs→` | `import { useState } from 'react'` |
| `imrse→` | `import { useState, useEffect } from 'react'` |
| `impt→` | `import PropTypes from 'prop-types'` |
| `imrr→` | `import { BrowserRouter as Router, Route, NavLink} from 'react-router-dom'` |
| `imbr→` | `import { BrowserRouter as Router} from 'react-router-dom'` |
| `imbrc→` | `import { Routes, Route, NavLink, Link } from 'react-router-dom'` |
| `imbrl→` | `import { Link } from 'react-router-dom'` |
| `imbrnl→` | `import { NavLink } from 'react-router-dom'` |
| `imrrs→` | `import { Routes, Route } from 'react-router-dom'` |
| `imcbr→` | `createBrowserRouter` and `RouterProvider` imports (React Router v6.4+) |
| `imnav→` | `import { useNavigate } from 'react-router-dom'` |
| `impar→` | `import { useParams } from 'react-router-dom'` |
| `imsp→` | `import { useSearchParams } from 'react-router-dom'` |
| `imld→` | `useLoaderData` import (React Router v6.4+) |
| `imfet→` | `useFetcher` import (React Router v6.4+) |
| `redux→` | `import { connect } from 'react-redux'` |
| `rconst→` | `constructor(props) { }` with state initialization |
| `est→` | `state = { }` |
| `cdm→` | `componentDidMount() { }` |
| `scu→` | `shouldComponentUpdate(nextProps, nextState) { }` |
| `cdup→` | `componentDidUpdate(prevProps, prevState) { }` |
| `cwun→` | `componentWillUnmount() { }` |
| `gdsfp→` | `static getDerivedStateFromProps(props, state) { }` |
| `gsbu→` | `getSnapshotBeforeUpdate = (prevProps, prevState) => { }` |
| `sst→` | `this.setState({ })` |
| `ssf→` | `this.setState((state, props) => { return { } })` |
| `props→` | `this.props.propName` |
| `state→` | `this.state.stateName` |
| `rcontext→` | `const $2 = React.createContext()` |
| `cref→` | `this.$2Ref = React.createRef()` |
| `bnd→` | `this.methodName = this.methodName.bind(this)` |
### React Native
| Prefix | Method |
| ---------: | ----------------------------------------------------------------- |
| `imrn→` | `import { $2 } from 'react-native'` |
| `rnstyle→` | `const styles = StyleSheet.create({})` |
| `rnc→` | React Native class component |
| `rncs→` | React Native class component with StyleSheet |
| `rnce→` | React Native class component with named export |
| `rnpc→` | React Native PureComponent |
| `rnpce→` | React Native PureComponent with named export |
| `rnf→` | React Native functional component |
| `rnfe→` | React Native functional component with separate default export |
| `rnfs→` | React Native functional component with StyleSheet |
| `rnfes→` | React Native function with StyleSheet and separate default export |
| `rnxf→` | Extended function component with hooks, SafeAreaView, and styles |
### Redux
| Prefix | Method |
| -----------: | ------------------------------------------------------------- |
| `rxaction→` | `redux action template` |
| `rxconst→` | `export const $2 = '$2'` |
| `rxreducer→` | `redux reducer template` |
| `rxselect→` | `redux selector template` |
| `rxslice→` | `redux slice template` |
| `rxslicex→` | `redux slice with extraReducers (pending/fulfilled/rejected)` |
| `rxthunk→` | `redux createAsyncThunk template` |
| `rxapi→` | `RTK Query createApi`, endpoint, and generated query hook |
### PropTypes
| Prefix | Method |
| -------: | ---------------------------------------- |
| `pta→` | `PropTypes.array` |
| `ptar→` | `PropTypes.array.isRequired` |
| `ptb→` | `PropTypes.bool` |
| `ptbr→` | `PropTypes.bool.isRequired` |
| `ptf→` | `PropTypes.func` |
| `ptfr→` | `PropTypes.func.isRequired` |
| `ptn→` | `PropTypes.number` |
| `ptnr→` | `PropTypes.number.isRequired` |
| `pto→` | `PropTypes.object` |
| `ptor→` | `PropTypes.object.isRequired` |
| `pts→` | `PropTypes.string` |
| `ptsr→` | `PropTypes.string.isRequired` |
| `ptnd→` | `PropTypes.node` |
| `ptndr→` | `PropTypes.node.isRequired` |
| `ptel→` | `PropTypes.element` |
| `ptelr→` | `PropTypes.element.isRequired` |
| `pti→` | `PropTypes.instanceOf(name)` |
| `ptir→` | `PropTypes.instanceOf(name).isRequired` |
| `pte→` | `PropTypes.oneOf(['name'])` |
| `pter→` | `PropTypes.oneOf(['name']).isRequired` |
| `ptet→` | `PropTypes.oneOfType([name])` |
| `ptetr→` | `PropTypes.oneOfType([name]).isRequired` |
| `ptao→` | `PropTypes.arrayOf(name)` |
| `ptaor→` | `PropTypes.arrayOf(name).isRequired` |
| `ptoo→` | `PropTypes.objectOf(name)` |
| `ptoor→` | `PropTypes.objectOf(name).isRequired` |
| `ptsh→` | `PropTypes.shape({ })` |
| `ptshr→` | `PropTypes.shape({ }).isRequired` |
| `ptex→` | `PropTypes.exact({ })` |
| `ptexr→` | `PropTypes.exact({ }).isRequired` |
| `ptany→` | `PropTypes.any` |
### Console
| Prefix | Method |
| ------ | ---------------------------------------------------------- |
| `clg→` | `console.log(object)` |
| `clo→` | ``console.log(`object`, object)`` |
| `clj→` | ``console.log(`object`, JSON.stringify(object, null, 2))`` |
| `ctm→` | ``console.time(`timeId`)`` |
| `cte→` | ``console.timeEnd(`timeId`)`` |
| `cas→` | `console.assert(expression,object)` |
| `ccl→` | `console.clear()` |
| `cco→` | `console.count(label)` |
| `cdi→` | `console.dir(object)` |
| `cer→` | `console.error(object)` |
| `cgr→` | `console.group('label')` |
| `cge→` | `console.groupEnd()` |
| `ctr→` | `console.trace(object)` |
| `cwa→` | `console.warn(object)` |
| `cin→` | `console.info(object)` |
| `ctl→` | `console.table([object])` |
### React 19 Directives
| Prefix | Method |
| -----: | ------------------------ |
| `usc→` | `'use client'` directive |
| `uss→` | `'use server'` directive |
### React Router v6.4+ Setup
| Prefix | Method |
| ----------: | ------------------------------------------------------------------ |
| `rtrsetup→` | Full `createBrowserRouter` setup with `RouterProvider` and routes |
| `rtrla→` | Scoped JS/strict-TS route with loader, action, and `useLoaderData` |
### React Components
> **Note:** Examples below show output with `importReactOnTop` set to `false` (default). When enabled, component snippets will include `import React from 'react'` at the top.
### `rcc`
```javascript
import { Component } from 'react';
export default class FileName extends Component {
render() {
return <>$2>;
}
}
```
### `rce`
```javascript
import { Component } from 'react';
export class FileName extends Component {
render() {
return <>$2>;
}
}
export default FileName;
```
### `rcep`
```javascript
import { Component } from 'react';
import PropTypes from 'prop-types';
export class FileName extends Component {
static propTypes = {};
render() {
return <>$2>;
}
}
export default FileName;
```
### `rpc`
```javascript
import { PureComponent } from 'react';
export default class FileName extends PureComponent {
render() {
return <>$2>;
}
}
```
### `rpcp`
```javascript
import { PureComponent } from 'react';
import PropTypes from 'prop-types';
export default class FileName extends PureComponent {
static propTypes = {};
render() {
return <>$2>;
}
}
```
### `rpce`
```javascript
import { PureComponent } from 'react';
export class FileName extends PureComponent {
render() {
return <>$2>;
}
}
export default FileName;
```
### `rccp`
```javascript
import { Component } from 'react';
import PropTypes from 'prop-types';
export default class FileName extends Component {
static propTypes = { $3: $4 };
render() {
return <>$2>;
}
}
```
> **React 19:** Function-component `propTypes` checks were removed. The `rfcp`, `rafcp`, `rmcp`, `hoc`, `hocredux`, and deprecated `rfcreduxp` snippets target React 17-18; prefer TypeScript for React 19 prop validation.
### `rfcp`
```javascript
import PropTypes from 'prop-types';
function FileName(props) {
return <>$2>;
}
FileName.propTypes = {};
export default FileName;
```
### `rfc`
```javascript
export default function FileName() {
return <>$2>;
}
```
### `rfce`
```javascript
function FileName() {
return <>$2>;
}
export default FileName;
```
### `rafcp`
```javascript
import PropTypes from 'prop-types';
const FileName = (props) => {
return <>$2>;
};
FileName.propTypes = {};
export default FileName;
```
### `rafc`
```javascript
export const FileName = () => {
return <>$2>;
};
```
### `rafce`
```javascript
const FileName = () => {
return <>$2>;
};
export default FileName;
```
### `rmc`
```javascript
import { memo } from 'react';
const FileName = memo(() => {
return <>$2>;
});
export default FileName;
```
### `rmcp`
```javascript
import { memo } from 'react';
import PropTypes from 'prop-types';
const FileName = memo((props) => {
return <>$2>;
});
FileName.propTypes = {};
export default FileName;
```
### `rcredux`
```javascript
import { Component } from 'react';
import { connect } from 'react-redux';
export class FileName extends Component {
render() {
return <>$2>;
}
}
const mapStateToProps = (state) => ({});
const mapDispatchToProps = {};
export default connect(mapStateToProps, mapDispatchToProps)(FileName);
```
### `rcreduxp`
```javascript
import PropTypes from 'prop-types';
import { Component } from 'react';
import { connect } from 'react-redux';
export class FileName extends Component {
static propTypes = {
$3: $4,
};
render() {
return <>$2>;
}
}
const mapStateToProps = (state) => ({});
const mapDispatchToProps = {};
export default connect(mapStateToProps, mapDispatchToProps)(FileName);
```
### `rfcredux`
```javascript
import { connect } from 'react-redux';
export const FileName = (props) => {
return <>$2>;
};
const mapStateToProps = (state) => ({});
const mapDispatchToProps = {};
export default connect(mapStateToProps, mapDispatchToProps)(FileName);
```
### `rfcreduxp`
Deprecated React 17-18 compatibility variant of `rfcredux` with function-component PropTypes. React 19 ignores these runtime checks.
### `reduxmap`
```javascript
const mapStateToProps = (state) => ({});
const mapDispatchToProps = {};
```
## TypeScript Components
All TypeScript component snippets use `type` for Props/State by default. Change to `interface` via the `typescriptPropsStatePrefix` setting.
| Prefix | Method |
| -----------: | ------------------------------------------------------- |
| `exptp→` | `export type` definition |
| `expint→` | `export interface` definition |
| `tsrcc→` | TypeScript class component with Props/State |
| `tsrce→` | TypeScript class component with separate default export |
| `tsrfce→` | TypeScript function with separate default export |
| `tsrfc→` | TypeScript functional component with default export |
| `tsrafce→` | TypeScript arrow function with separate default export |
| `tsrafc→` | TypeScript arrow function component with named export |
| `tsrpc→` | TypeScript PureComponent |
| `tsrpce→` | TypeScript PureComponent with separate default export |
| `tsrcredux→` | TypeScript class component with Redux |
| `tsrnf→` | TypeScript React Native arrow function component |
| `tsrnfs→` | TypeScript React Native arrow function with StyleSheet |
## React Native Components
### `rnc`
```javascript
import { Component } from 'react';
import { Text, View } from 'react-native';
export default class FileName extends Component {
render() {
return (
$2
);
}
}
```
### `rnf`
```javascript
import { View, Text } from 'react-native';
export default function FileName() {
return (
$2
);
}
```
### `rnfs`
```javascript
import { StyleSheet, View, Text } from 'react-native';
export default function FileName() {
return (
$2
);
}
const styles = StyleSheet.create({});
```
### `rnfe`
```javascript
import { View, Text } from 'react-native';
const FileName = () => {
return (
$2
);
};
export default FileName;
```
### `rnfes`
```javascript
import { StyleSheet, View, Text } from 'react-native';
const FileName = () => {
return (
$2
);
};
export default FileName;
const styles = StyleSheet.create({});
```
### `rncs`
```javascript
import { Component } from 'react';
import { Text, StyleSheet, View } from 'react-native';
export default class FileName extends Component {
render() {
return (
$2
);
}
}
const styles = StyleSheet.create({});
```
### `rnce`
```javascript
import { Component } from 'react';
import { Text, View } from 'react-native';
export class FileName extends Component {
render() {
return (
$2
);
}
}
export default FileName;
```
## Others
### `cmmb`
```javascript
/**
* $2
*/
```
### `desc`
```text
describe('$2', () => { $3 })
```
### `test`
```text
test('should $2', () => { $3 })
```
### `tit`
```text
it('should $2', () => { $3 })
```
### `tita`
```text
it('should $2', async () => { $3 })
```
### `testa`
```text
test('should $2', async () => { $3 })
```
### `stest`
```javascript
import renderer from 'react-test-renderer';
import { FileName } from '../FileName';
describe('', () => {
const defaultProps = {};
const wrapper = renderer.create();
test('render', () => {
expect(wrapper).toMatchSnapshot();
});
});
```
### `srtest`
```javascript
import renderer from 'react-test-renderer';
import { Provider } from 'react-redux';
import store from '~/store';
import { FileName } from '../FileName';
describe('', () => {
const defaultProps = {};
const wrapper = renderer.create(
,
);
test('render', () => {
expect(wrapper).toMatchSnapshot();
});
});
```
### `sntest`
```javascript
import 'react-native';
import renderer from 'react-test-renderer';
import FileName from '../FileName';
describe('', () => {
const defaultProps = {};
const wrapper = renderer.create();
test('render', () => {
expect(wrapper).toMatchSnapshot();
});
});
```
### `snrtest`
```javascript
import 'react-native';
import renderer from 'react-test-renderer';
import { Provider } from 'react-redux';
import store from '~/store';
import FileName from '../FileName';
describe('', () => {
const defaultProps = {};
const wrapper = renderer.create(
,
);
test('render', () => {
expect(wrapper).toMatchSnapshot();
});
});
```
### `hocredux`
```javascript
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
export const mapStateToProps = (state) => ({});
export const mapDispatchToProps = {};
export const $2 = (WrappedComponent) => {
const hocComponent = ({ ...props }) => ;
hocComponent.propTypes = {};
return hocComponent;
};
export default (WrapperComponent) =>
connect(mapStateToProps, mapDispatchToProps)($2(WrapperComponent));
```
### `hoc`
```javascript
import PropTypes from 'prop-types';
export default (WrappedComponent) => {
const hocComponent = ({ ...props }) => ;
hocComponent.propTypes = {};
return hocComponent;
};
```