---
# System prepended metadata

title: Cheat Sheet

---

# Cheat Sheet 

## Function -> Arrow Function conversion


```js
function getComments(song) {
  return fetch(`http://localhost:3000/comments?songId=${song.id}`)
    .then(res => res.json())
}
```

- Remove function keyword
- Replace with const
- The function name becomes the const name
- Add `=` sign (assignment operator) between const name and parameters list
- After parameters list (but before the curly braces) add an arrow

```js
const getComments = (song) => {
  return fetch(`http://localhost:3000/comments?songId=${song.id}`)
    .then(res => res.json())
}
```

## Converting Arrow Function to Regular function

```js
const updateSong = (songId, songData) => {
    return fetch(`http://localhost:3000/songs/${songId}`, {
      method: 'PATCH',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(songData)
    })
      .then(res => res.json())
  }
```

- Replace const keyword with function keyword
- Remove `=` sign (assignment operator) and all space between function name and parameters list
- Remove the `=>` between parameters list and curly braces


```js
function updateSong(songId, songData) {
    return fetch(`http://localhost:3000/songs/${songId}`, {
      method: 'PATCH',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(songData)
    })
      .then(res => res.json())
  }
```


## Arrow functions for Callbacks

```js
function getComments(song) {
  return fetch(`http://localhost:3000/comments?songId=${song.id}`)
    .then(res => res.json())
}
```

Better than 
```js
function getComments(song) {
  return fetch(`http://localhost:3000/comments?songId=${song.id}`)
    .then(function(res) { return res.json()})
}
```

## Multi Line parameters in Arrow function (using Destructuring Assignment)

```js
const renderComment = ({
  id, 
  comment,
  publishedAt,
  author
}) => {
  const target = document.querySelector('#comments');
  const p = document.createElement('p');
  p.className = "flex justify-between";
  p.innerHTML = `
  <input class="w-5/6" />
  <button><i class="fas fa-trash-alt"></i></button>
  `
  const input = p.querySelector('input');
  const deleteBtn = p.querySelector('button');
  input.value = comment;
  // add event listeners for updating or deleting a comment
  input.addEventListener('keyup', (e) => {
    updateComment(id, { comment: e.target.value });
  })
  deleteBtn.addEventListener('click', (e) => {
    deleteComment(id)
      .then(() => p.remove())
  })
  target.append(p);
}
```

Alternatively:


```js
const renderComment = (record) => {
  const {
    id, 
    comment,
    publishedAt,
    author
  } = record;
  const target = document.querySelector('#comments');
  const p = document.createElement('p');
  p.className = "flex justify-between";
  p.innerHTML = `
  <input class="w-5/6" />
  <button><i class="fas fa-trash-alt"></i></button>
  `
  const input = p.querySelector('input');
  const deleteBtn = p.querySelector('button');
  input.value = comment;
  // add event listeners for updating or deleting a comment
  input.addEventListener('keyup', (e) => {
    updateComment(id, { comment: e.target.value });
  })
  deleteBtn.addEventListener('click', (e) => {
    deleteComment(id)
      .then(() => p.remove())
  })
  target.append(p);
}
```

useState hook

```js
const [tasks, setTasks] = useState([])
```
- useState([]) returns an array with two elements in it
- tasks will refer to the first element
- setTasks will refer to the second element