ログイン
問題3

Vueでアプリレイアウトを作ろう! フォーム編

アイコン画像

問題3:Vueでアプリレイアウトを作ろう! フォーム編

今度はListComponentにFormを追加してリストにデータを
pushできるようにしよう。
今回は特にFormをコンポーネント化する必要はない。
どのコンポーネントにForm要素を追加するのかをよく考えて実装してみよう。

エディターのアイコンあらかじめエディタに書くコード

                --- Main.vue
<template>
  <div class="main-container">
    <list></list>
  </div>
</template>
<script>
</script>
<style>
  .main-container {
    width: 80%;
    background: #ddd;
  }
  .main-container h1 {
    padding-top: 50px;
  }
</style>
¥Vue¥
              
                --- ListItem.vue
<template>
  <div>
    <li class="list-item">{{ dream.name }}</li>
  </div>
</template>
<script>
</script>
<style>
  .list-item {
    width: 100%;
    padding: 8px;
    margin-bottom: 10px;
    list-style: none;
    border-left: 5px solid #40b983;
    border-bottom: 1px solid #40b983;
    border-top:  1px solid #40b983;
    border-right: 1px solid #40b983;
    font-weight: 700;
  }
  .list-item:hover {
    background: #40b983;
    opacity: .8;
    color: #fff;
  }
</style>
¥Vue¥
              
                --- List.vue
<template>
  <div>
    <div class="main-form-wrapper">
      <form v-on:submit.prevent="addDream">
        <input type="text" v-model="newDreamName" class="form-input" placeholder="あなたの夢を追加してください">
        <input type="submit" class="form-submit">
      </form>
    </div>
    <div class="main-list-wrapper">
      <ul class="main-list">
        <listitem v-for="dream in dreams" :dream="dream" :key="dream.id"></listitem>
      </ul>
    </div>
  </div>
</template>
<script>
</script>
<style>
  .main-list-wrapper, .main-form-wrapper{
    background: #fff;
    width: 80%;
    margin: 2rem auto;
    border-radius: 15px;
  }
  .main-list {
    padding: 2rem;
    text-align: left;
  }
  .main-form-wrapper .form-input {
    width: 30%;
    margin: 30px;
    border: 1px solid #ddd;
    border-radius: 5px;
    height: 40px;
    padding-left: 8px;
  }
  .main-form-wrapper .form-submit {
    background: #40b983;
    color: #fff;
    border: none;
    padding: 8px 16px;
    border-radius: 5px;
  }
</style>
¥Vue¥
              

ブラウザのアイコン期待する画面


タグアイコン解答ソースコード

              --- Main.vue
<script>
import List from './List'
export default {
  components: {
    List
  }
}
</script>
¥Vue¥
            
              --- List.vue
<script>
import ListItem from './ListItem'
export default {
  name: 'List',
  components: {
    ListItem
  },
  data() {
    return{
      dreams: [
        { id: 1, name: "フルスタックエンジニアになりたい"},
        { id: 2, name: "バックエンドエンジニアになりたい"},
        { id: 3, name: "フロントエンドエンジニアになりたい"},
        { id: 4, name: "データサイエンティストになりたい"},
        { id: 5, name: "スティーブジョブズになりたい"}
      ],
      newDreamName: "",
    }
  },
  methods: {
    addDream() {
      this.dreams.push({
        name: this.newDreamName
      });
      this.newDreamName = "";
    }
  }
}
</script>
¥Vue¥
            
              --- ListItem.vue
<script>
export default {
  props: {
    dream: {
      type: Object,
    }
  }
}
</script>
¥Vue¥
            

コメントのアイコン解説

ポインとしては、`v-on:submit.prevent="addDream"`の部分で、ここを普通のv-on:submitだとページ遷移が発生して
配列に追加しデータがすぐに消えてしまうから気をつけて欲しい。
ログインして解答を見る
完了にする!
twitterのアイコン
活動記録をTweetする
Vueを学ぶなら現役エンジニア監修「甲賀コース」
LINEの友達追加でお役立ち動画をGET!!

閉じる