---
# System prepended metadata

title: Vue assessment topics

---

# Vue assessment topics

All questions in terms of ES6 and Vue 2. No external libs.
Feel free to use playground like https://jsfiddle.net/ if you in doubt.

Term "write a code" assumes writing a proof-of-concept, not actually working code, but syntax/logic correctivity are desirable.

## Basic JS

### One. 
Cover conceptual difference between `==` and `===`?


### Two. 
How to check if two **arrays of strings** contains the same values?

```javascript=
function isListingStable(before, after){
    // implement
}

isListingStable(
    ["AAPL", "MSFT", "AMZN", "TSLA"],
    ["TSLA", "AAPL", "MSFT", "AMZN"]
)
```



### Three. 
Implement simple function that formats valid UNIX-timestamp as `yyyy-mm-dd`.
Example: `1.62e9` should be `2021-05-03`
```javascript=
function formatDate(timestamp){
    return // implement formatter
}
```

### Four.
```javascript=
fuction catchRocket(){
    console.log("Gotcha!")
}

document.addEventListener('ironDome', catchRocket);
```
How to trigger `ironDome` event?

## Data manipulation

Assume we have a dataset of currency conversion rates.

```json=
[
    {
        "date": "2021-02-30",
        "baseRate": "EUR",
        "rates": {
            "EUR": 1.00,
            "USD": 1.20,
            "HDK": 9.40,
            "ILS": 4.00,
            ...
        }
    }
]
```

Write a method using **map/reduce** to get a rates list for the specified currency. Keep codebase **as simple as you can**.
Keep in mind that method should be easy extendable when `date` argument will be used.

```javascript=
import { rates } from './rates.json'

function getRates(forCurrency: String) {
    // TODO
}
```

*Hint: Way to handle edge cases is up on you.*

## Vue 🎸

### Data flow
Write down all ways to pass data between two components if:
1. they are in parent-child relation;
2. they have common parent;
3. they have common root;
4. they completely separated.
**Hint: globals from window, closure and $modules are welcome.**

(extra) 5. they are on different pages, like between Chrome Extension & Vue website, or Google.Sheets & Google Apps Sidebar in Vue.

### Vue's dollars
Shortly cover **edge cases** of reactivity when `Vue.set`/`this.$set` needed.

On what situations you used `$nextTick` on **previous projects**?

### Slots

Explain the syntax/logic difference between following slots directives: 
a) `v-slot:value` 
b) `v-slot="value"`
c) `v-slot="{value}"`
d) `v-slot:value="{value}"`
e) `#default="{value}"`
f) `#value="{value}"`

### Directives

What is the difference between `v-if`, `v-show` and `v-on`?


### Watchers

Could we define a `watch` inside mixin? If so how it will looks like?


## Reactivity

### Classes

Having a class:

```javascript=
class Wallet {
    currency: {
        symbol: String,
        name: String,
    },
    balance: Number
    label: String
    lastUpdated: Number
}
```

Make it reactive using Vue.

How to connect it with another components that will update their state/value on Wallet changes? 


What disadvantages will have this class after setting reactivity?


How to **clone** that class without loosing reactivity?


### Approaches

**Briefly** compare reactivity practices available in Vue
**Add 2-3 more approaches** to the table and compare them
**Hint: window**
Approach | Pros + | Cons -
---- | ---- | ----
Vuex        |             | 
event bus   |             |
...         |             |



## Single File Components

**Code-review task.** 
- Find and mark as much errors as you see.
- **including UX experience**

Mark with comments right inside the code.

```htmlmixed=
<script language="javascript">
Vue.Component("signupPage", {
    data() {
        placeholder: "mail@example.com"
        value: ""
    }
    submit() {
        await alert("Form submitted, thanks!")
    }
})
</script>
<style>
html {
    font-family: Montserrat, serif;
}
</style>
<template language="pug">
div
    h1 Company landing
    h2 All headers are centered
div
    h2 Sign up newsletter
    form(onsubmit.prevent="submit()")
        input(v-model="placeholder" :value="value")
        button(type="button" @click="submit") 
            span Sign as { value }
</template>
<style scoped>
body {
    background-color: orange;
    color: var(--base-color);
}
h1, h2 {
    font-size: 2rem;
    color: #ff8800;
    justify-content: center;
}
h2 {
    font-size: 1rem;
}
input, button {
    border: none;
    background: transparent;
    color: inherit;
}
</style>
```

## DOM

Assume we have a year-based hourly report table with 10 columns, divided onto 12 section, each around 30 x 24 = 720 items and footer with totals. Data updates via external source trigger. Some of columns might be sortable. Data in cells are plain numbers, not interactivity needed.

Write a **draft** of render-efficient component to display that table. No need to implement all details, just cover all significant logic.

**Hint: use `render` and `innerHTML` manipulation, organise data before render.**

```javascript=
export const subscribeForData = (endpoint, onDataCallback) => {
    // third-party class
    return apifetcher(endpoint).
        on('data', (data) => {
            // data = [
            // {
            //     date: timestamp,
            //     values: [
            //         value,
            //         ... 9 more cols
            //     ],
            // },
            // ... 8759 more rows
            // ]
            onDataCallback(data)
        }).
        on('error', (error) => console.error)
}

new Vue({
    template: `<EfficientTable
    source="wss://localhost:8443/report"
    :renderFooter="false">
    <template v-slot:title>Annual COVID cases report</template>
    </EfficientTable>`
}).mount(window.body)
```

```javascript=
export default {
    name: "EfficientTable",
    
    // component implementation 
    // goes here: props, render, etc.
}
```

