Vue 新手小項目 vue-translate-peoject 在線翻譯功能

開始

這是一適合新手練習的小項目,一個在線翻譯的demo。
圖片描述
在正式開始前,先囉嗦一下,是一位網友給個人建議,就是不要強行組件化的問題 開始作Vue時咱們可能會喜歡拆不少組件出來 但記住組件是爲了複用(常見如公共菜單按鈕欄等) 如非可以複用的狀況其實並不用真的拆出組件來 。
固然,這個項目裏由於是練手,因此強行組件化來涉及更多的vue用法。vue

目錄結構

src下新建了兩個文件:TranslateForm.vue表單組件和TranslateText.vue翻譯結果組件
圖片描述jquery

涉及的語法

  • 指令:v-model,v-on,v-bind
  • 父子組件通訊:$emit,props
  • 動態更新數據:vm.$set
  • 翻譯服務的API,我這裏用的是有道翻譯的api

——————————————————————————————分割線————————————————————————git

TranslateForm.vue

<template>
  <div>
    <!--加上頁面修飾符,提交時就不回再重載頁面-->
    <form v-on:submit.prevent="formSubmit">
      <input type="text" v-model="text" placeholder="輸入須要翻譯的內容"/>
      <select v-model="to">
        <option value ="en">英文</option>
        <option value ="ko">韓文</option>
        <option value ="fr">法文</option>
        <option value ="ru">俄文</option>
      </select>
      <input type="submit" value="翻譯"/>
    </form>
  </div>
</template>

<script>
export default {
  name: 'TranslateForm',
  data: function () {
    return {
      text: '',
      to: 'en'
    }
  },
  methods: {
    formSubmit: function () {
      this.$emit('formSubmit', this.text, this.to)
    }
  }
}
</script>

<style></style>

這裏沒啥好說的,text和to兩個變量分別是要翻譯的文字和翻譯語言的選項,this.$emit把數據傳給父組件使用github

根組件APP

<template>
  <div id="app">
    <h2>簡單翻譯</h2><span>簡單/易用/便捷</span>
    <TranslateForm v-on:formSubmit="textTranslate"></TranslateForm>
    <TranslateText :translated-text="translatedText"></TranslateText>
  </div>
</template>

<script>
import TranslateForm from './components/TranslateForm.vue'
import TranslateText from './components/TranslateText.vue'
import md5 from 'blueimp-md5'
import $ from 'jquery'

export default {
  name: 'App',
  data: function () {
    return {
      translatedText: '2',
      appKey: '47bb6e424790df89',
      key: 'NH2VxBadIlKlT2b2qjxaSu221dSC78Ew',
      salt: (new Date()).getTime(),
      from: '',
      to: 'en'
    }
  },
  components: {
    TranslateForm, TranslateText
  },
  methods: {
    textTranslate: function (text, to) {
      let vm = this
      $.ajax({
        url: 'http://openapi.youdao.com/api',
        type: 'post',
        dataType: 'jsonp',
        data: {
          q: text,
          appKey: this.appKey,
          salt: this.salt,
          from: this.from,
          to: to,
          sign: md5(this.appKey + text + this.salt + this.key)
        },
        success: function (data) {
          vm.$set(vm.$data, 'translatedText', data.translation[0])
        }
      })
    }
  }
}
</script>

<style>
  #app {
    font-family: 'Avenir', Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
    margin-top: 60px;
  }
</style>

一、父組件拿到子組件傳來的數據後開始經過api來請求數據
二、我用的是有道api http://ai.youdao.com/login.s api文檔裏對於api的使用已經很詳細了,我在這裏是第一次使用api,沒以爲難
三、須要本身安裝兩個依賴:一個是jquery因爲ajax請求api,一個是blueimp-md5在請求api時會用到裏面的md5()
四、用vue.set將獲得的結果綁定到translatedText這個變量,在這一步的時候我踩了兩個坑
第一個坑:習慣了之前的寫法,直接就這樣給變量賦值,結果變量的值並未改變,這時我還不知到有Vue.set這個語法,後面百度才知道的(不認真看文檔的下場)web

success: function (data) {
            this.translatedText = data.translation[0]
            console.log(this.translatedText)
        }

第二個坑:照着文檔來寫,而後報錯了:this.$set is not a function,這裏報錯是由於success這個函數裏的this指向的不是當前的VueModelajax

success: function (data) {
          this.$set(this.$data, 'translatedText', data.translation[0])
        }

因此我在前面定義了一個vm變量來充當當前Model,而後就不報錯了。json

TranslateText.vue

<template>
  <div id="TranslateText">
    <p>{{translatedText}}</p>
  </div>
</template>

<script>
export default {
  name: 'TranslateText',
  props: [
    'translatedText'
  ]
}
</script>

<style></style>

props接收父組件傳值來使用api

最後

這個文章我本身看了一下,寫的確實很差,許多地方不通順,但願你們多多包涵
代碼我上傳到github了 https://github.com/Zone-F/vue... (沒加樣式)
還有就是這個我是在騰訊課堂裏的課程裏學的:https://ke.qq.com/course/2275...app

相關文章
相關標籤/搜索