or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

index.mdnative-routing.mdnavigation-hooks.mdreact-router-components.mdreact-router-hooks.mdreact-router-utilities.mdsearch-parameters.md

search-parameters.mddocs/

0

# Search Parameters

1

2

Enhanced URLSearchParams functionality adapted for React Native applications with mobile-optimized parameter handling and React hooks integration.

3

4

## Capabilities

5

6

### useSearchParams

7

8

A convenient wrapper for accessing and modifying individual query parameters via the URLSearchParams interface. Provides React state integration for URL search parameters.

9

10

```typescript { .api }

11

/**

12

* Hook for managing URL search parameters with React state integration

13

* Provides current search params and setter function

14

* @param defaultInit - Default parameters to merge when not present in URL

15

* @returns Tuple of [searchParams, setSearchParams]

16

*/

17

function useSearchParams(

18

defaultInit?: URLSearchParamsInit

19

): [URLSearchParams, SetURLSearchParams];

20

21

type SetURLSearchParams = (

22

nextInit?:

23

| URLSearchParamsInit

24

| ((prev: URLSearchParams) => URLSearchParamsInit),

25

navigateOpts?: NavigateOptions

26

) => void;

27

```

28

29

**Usage Examples:**

30

31

```typescript

32

import { useSearchParams } from "react-router-native";

33

import { View, Text, TextInput, TouchableOpacity } from "react-native";

34

import { useState } from "react";

35

36

// Basic search params usage

37

function SearchScreen() {

38

const [searchParams, setSearchParams] = useSearchParams();

39

const [query, setQuery] = useState(searchParams.get("q") || "");

40

41

const handleSearch = () => {

42

setSearchParams({ q: query });

43

};

44

45

return (

46

<View>

47

<Text>Current search: {searchParams.get("q") || "None"}</Text>

48

<TextInput

49

value={query}

50

onChangeText={setQuery}

51

placeholder="Search..."

52

/>

53

<TouchableOpacity onPress={handleSearch}>

54

<Text>Search</Text>

55

</TouchableOpacity>

56

</View>

57

);

58

}

59

60

// With default parameters

61

function FilteredList() {

62

const [searchParams, setSearchParams] = useSearchParams({

63

sort: "name",

64

page: "1"

65

});

66

67

const currentSort = searchParams.get("sort");

68

const currentPage = searchParams.get("page");

69

70

const updateSort = (newSort) => {

71

setSearchParams(prev => {

72

prev.set("sort", newSort);

73

prev.set("page", "1"); // Reset to first page

74

return prev;

75

});

76

};

77

78

return (

79

<View>

80

<Text>Sort: {currentSort}, Page: {currentPage}</Text>

81

<TouchableOpacity onPress={() => updateSort("date")}>

82

<Text>Sort by Date</Text>

83

</TouchableOpacity>

84

</View>

85

);

86

}

87

88

// Functional updates

89

function AdvancedFilters() {

90

const [searchParams, setSearchParams] = useSearchParams();

91

92

const addFilter = (key, value) => {

93

setSearchParams(prev => {

94

const newParams = new URLSearchParams(prev);

95

newParams.append(key, value);

96

return newParams;

97

});

98

};

99

100

const removeFilter = (key) => {

101

setSearchParams(prev => {

102

const newParams = new URLSearchParams(prev);

103

newParams.delete(key);

104

return newParams;

105

});

106

};

107

108

return (

109

<View>

110

<Text>Active filters: {searchParams.toString()}</Text>

111

<TouchableOpacity onPress={() => addFilter("category", "electronics")}>

112

<Text>Add Electronics Filter</Text>

113

</TouchableOpacity>

114

<TouchableOpacity onPress={() => removeFilter("category")}>

115

<Text>Remove Category Filter</Text>

116

</TouchableOpacity>

117

</View>

118

);

119

}

120

121

// With navigation options

122

function PaginatedList() {

123

const [searchParams, setSearchParams] = useSearchParams({ page: "1" });

124

125

const goToPage = (pageNum) => {

126

setSearchParams(

127

{ page: pageNum.toString() },

128

{ replace: true } // Replace instead of push to avoid back button issues

129

);

130

};

131

132

return (

133

<View>

134

<Text>Current page: {searchParams.get("page")}</Text>

135

<TouchableOpacity onPress={() => goToPage(2)}>

136

<Text>Go to Page 2</Text>

137

</TouchableOpacity>

138

</View>

139

);

140

}

141

```

142

143

### createSearchParams

144

145

Creates a URLSearchParams object using the given initializer. This is identical to `new URLSearchParams(init)` except it also supports arrays as values in the object form.

146

147

```typescript { .api }

148

/**

149

* Creates a URLSearchParams object with enhanced array support

150

* Supports string, array, object, and URLSearchParams initializers

151

* @param init - Initial parameters in various formats

152

* @returns URLSearchParams instance

153

*/

154

function createSearchParams(init?: URLSearchParamsInit): URLSearchParams;

155

156

type URLSearchParamsInit =

157

| string

158

| ParamKeyValuePair[]

159

| Record<string, string | string[]>

160

| URLSearchParams;

161

162

type ParamKeyValuePair = [string, string];

163

```

164

165

**Usage Examples:**

166

167

```typescript

168

import { createSearchParams } from "react-router-native";

169

170

// From string

171

const params1 = createSearchParams("q=search&sort=name");

172

console.log(params1.get("q")); // "search"

173

174

// From object with single values

175

const params2 = createSearchParams({

176

q: "search term",

177

sort: "date",

178

page: "1"

179

});

180

181

// From object with array values (multiple values for same key)

182

const params3 = createSearchParams({

183

categories: ["electronics", "books"],

184

tags: ["sale", "featured"]

185

});

186

console.log(params3.getAll("categories")); // ["electronics", "books"]

187

188

// From key-value pair arrays

189

const params4 = createSearchParams([

190

["sort", "name"],

191

["sort", "price"], // Multiple values for same key

192

["category", "electronics"]

193

]);

194

195

// From existing URLSearchParams

196

const existing = new URLSearchParams("a=1&b=2");

197

const params5 = createSearchParams(existing);

198

199

// Complex example with arrays

200

const filterParams = createSearchParams({

201

search: "laptop",

202

categories: ["electronics", "computers"],

203

priceRange: ["100", "500"],

204

inStock: "true"

205

});

206

207

// Results in: search=laptop&categories=electronics&categories=computers&priceRange=100&priceRange=500&inStock=true

208

```

209

210

## Types

211

212

```typescript { .api }

213

type URLSearchParamsInit =

214

| string

215

| ParamKeyValuePair[]

216

| Record<string, string | string[]>

217

| URLSearchParams;

218

219

type ParamKeyValuePair = [string, string];

220

221

type SetURLSearchParams = (

222

nextInit?:

223

| URLSearchParamsInit

224

| ((prev: URLSearchParams) => URLSearchParamsInit),

225

navigateOpts?: NavigateOptions

226

) => void;

227

228

// Navigation options for setSearchParams

229

interface NavigateOptions {

230

replace?: boolean;

231

state?: any;

232

relative?: RelativeRoutingType;

233

}

234

235

type RelativeRoutingType = "route" | "path";

236

```

237

238

## Mobile Optimization Features

239

240

### Default Parameter Handling

241

242

- **Automatic Merging**: Default parameters are automatically merged with URL parameters

243

- **Persistent Defaults**: Default values persist even when not in the URL

244

- **Override Support**: URL parameters override defaults when present

245

246

### Array Support

247

248

- **Multiple Values**: Object initializer supports arrays for multiple values per key

249

- **Backward Compatibility**: Standard URLSearchParams behavior for string and array initializers

250

- **Convenient Syntax**: Cleaner syntax than manual array construction

251

252

### State Integration

253

254

- **React Hooks**: Full integration with React component state

255

- **Automatic Updates**: Components re-render when search parameters change

256

- **Navigation Integration**: Parameter changes trigger navigation updates

257

258

## Usage Patterns

259

260

### Search and Filtering

261

262

```typescript

263

// Typical search implementation

264

function useSearch() {

265

const [searchParams, setSearchParams] = useSearchParams({

266

q: "",

267

sort: "relevance",

268

page: "1"

269

});

270

271

const search = (query) => {

272

setSearchParams(prev => {

273

const newParams = new URLSearchParams(prev);

274

newParams.set("q", query);

275

newParams.set("page", "1"); // Reset pagination

276

return newParams;

277

});

278

};

279

280

return { searchParams, search };

281

}

282

```

283

284

### Pagination

285

286

```typescript

287

// Pagination with search params

288

function usePagination() {

289

const [searchParams, setSearchParams] = useSearchParams({ page: "1" });

290

291

const setPage = (page) => {

292

setSearchParams(prev => {

293

const newParams = new URLSearchParams(prev);

294

newParams.set("page", page.toString());

295

return newParams;

296

}, { replace: true }); // Replace to avoid cluttering history

297

};

298

299

return {

300

currentPage: parseInt(searchParams.get("page") || "1"),

301

setPage

302

};

303

}

304

```

305

306

### Multi-select Filters

307

308

```typescript

309

// Multi-select filter implementation

310

function useFilters() {

311

const [searchParams, setSearchParams] = useSearchParams();

312

313

const toggleFilter = (key, value) => {

314

setSearchParams(prev => {

315

const newParams = new URLSearchParams(prev);

316

const current = newParams.getAll(key);

317

318

if (current.includes(value)) {

319

// Remove the value

320

newParams.delete(key);

321

current.filter(v => v !== value).forEach(v => {

322

newParams.append(key, v);

323

});

324

} else {

325

// Add the value

326

newParams.append(key, value);

327

}

328

329

return newParams;

330

});

331

};

332

333

return { searchParams, toggleFilter };

334

}

335

```