---
# System prepended metadata

title: frontend
tags: [axios, vuejs]

---

# axios
https://github.com/axios/axios
Promise based HTTP client for the browser and node.js 

## cdn
`<script src="https://unpkg.com/axios/dist/axios.min.js"></script>`

## Performing a GET request
```javascript=
// Make a request for a user with a given ID
axios.get('/user?ID=12345')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

// Optionally the request above could also be done as
axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

// Want to use async/await? Add the `async` keyword to your outer function/method.
async function getUser() {
  try {
    const response = await axios.get('/user?ID=12345');
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}
```

## performing post method
```javascript=
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });
```

## Performing multiple concurrent requests
```javascript=
function getUserAccount() {
  return axios.get('/user/12345');
}

function getUserPermissions() {
  return axios.get('/user/12345/permissions');
}

axios.all([getUserAccount(), getUserPermissions()])
  .then(axios.spread(function (acct, perms) {
    // Both requests are now complete
  }));
```

# vuejs
https://vuejs.org/index.html

## Capturing User Inputs
```htmlmixed=
<div id="app">
  <label for="name">Name:</label>
  <input id="name" type="text" v-model="name" /> <!--v-model is doing the magic here-->
  <p>{{ name }}</p>
</div>
```
```javascript=
//this is a vue instance
new Vue({
  //this targets the div id app
  el: '#app',
  data: {
    name: '' //this stores data values for ‘name’
  }
})
```
`v-model`會監視`name`的改變，改變的值會響應到前端上。

## Storing User Input On A Single Event
```htmlmixed=
<div id="app">
  <label for="name">Name:</label>
  <input id="name" type="text" v-model.lazy="name" />
  <p>{{ name }}</p>
</div>
```
```javascript=
//this is a vue instance
new Vue({
  el: '#app',
  data: {
    name: ''
  }
});
```
`v-model.lazy`會等數入完成後才響應到網頁上

## Toggling Classes
```htmlmixed=
<div id="app">
  <button @click="active = !active" :aria-pressed="active ? 'true' : 'false'">Toggle me</button>
  <p :class="{ red: active }">Sometimes I need to be styled differently</p>
</div>
```
```javascript=
.red {
  color: red;
}

JS
new Vue({
  el: '#app',
  data: {
    active: false
  }
})
```
* `@click`:`v-on`的縮寫，完整式`v-on:click`，click的監聽器
* `@click="active = !active"`:把active做not 運算
* `:aria-pressed="active ? 'true' : 'false'"`:`v-bind`縮寫，完整式`v-bind:aria-pressed`，`aria-pressed`是button的attribute規則
	* If `aria-pressed="true"` is used the button is a toggle button that is currently pressed.
	* https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role
* `:class="{ red: active }"`:如果是active狀態，把class套用紅色的css規則

## Hiding And Showing
```htmlmixed=
<div id="app">
  <button @click="show = !show" :aria-expanded="show ? 'true' : 'false'">
    Toggle Panel
  </button>
  <p v-if="show">hello</p>
</div>
```
```javascript=
new Vue({
  el: '#app',
  data: {
    show: true
  }
})
```
`v-if`:if 規則
`v-show`:當參數值不為null時顯示
```htmlmixed=
<div id="app">
  <label for="textarea">What is your favorite kind of taco?</label>
  <textarea id="textarea" v-model="tacos"></textarea>
  <br>
  <button v-show="tacos">Let us know!</button>
</div>
```
```javascript=
new Vue({
  el: '#app',
  data() {
    return {
      tacos: ''
    }
  }
})

```

## Submitting A Form
```htmlmixed=
<div id="app">
  <form @submit.prevent="submitForm">
    <div>
      <label for="name">Name:</label><br>
      <input id="name" type="text" v-model="name" required/>
    </div>
    <div>
      <label for="email">Email:</label><br>
      <input id="email" type="email" v-model="email" required/>
    </div>
    <div>
      <label for="caps">HOW DO I TURN OFF CAPS LOCK:</label><br>
      <textarea id="caps" v-model="caps" required></textarea>
    </div>
    <button :class="[name ? activeClass : '']" type="submit">Submit</button>
    <div>
      <h3>Response from server:</h3>
      <pre>{{ response }}</pre>
    </div>
  </form>
</div>

```
```javascript=
new Vue({
  el: '#app',
  data() {
    return {
      name: '',
      email: '',
      caps: '',
      response: '',
      activeClass: 'active'
    }
  },
  methods: {
    submitForm() {
      axios.post('//jsonplaceholder.typicode.com/posts', {
        name: this.name,
        email: this.email,
        caps: this.caps
      }).then(response => {
        this.response = JSON.stringify(response, null, 2)
      })
    }
  }
})

```
event.preventDefault()：
	如果事件可以被取消，就取消事件（即取消事件的預設行為）。但不會影響事件的傳遞，事件仍會繼續傳遞。submit.prevent為vuejs的呼叫方式。

