2016-10-14 13 views
0

私はVueを初めて使い慣れているので、作成したフォームでうまく動作するコンポーネントをどのように変更すればいいか、私は変更したい私はそれを編集フォームにも使うことができます。私がする必要があるのは、イメージsrcをDBから取得するイメージに設定することです(存在する場合)。それをどうすれば実現できますか?Vue/laravel - ブレードからvueへのデータの受け渡し

<template> 
<div> 
    <div v-if="!image"> 
    <h2>Select an image</h2> 
    <input type="file" @change="onFileChange"> 
    </div> 
    <div v-else> 
    <img :src="image" /> 
    <input type="file" name="image" style="display:none"> 
    <button @click="removeImage">Remove image</button> 
    </div> 
</div> 
</template> 

<script> 
export default { 
    data() { 
     return { 
     image: '', 
     formData:new FormData(), 
     file: null 
     } 
    }, 
    methods: { 
     onFileChange: function onFileChange(e) { 
      var files = e.target.files || e.dataTransfer.files; 
      if (!files.length) 
       return; 
      this.createImage(files[0]); 
      this.formData.append('file', files[0]); 
      this.file = files[0]; 
     }, 
     createImage: function createImage(file) { 
      var image = new Image(); 
      var reader = new FileReader(); 
      var vm = this; 
      reader.onload = function (e) { 
       vm.image = e.target.result; 
      }; 
      reader.readAsDataURL(file); 
     }, 
     removeImage: function removeImage(e) { 
      this.image = ''; 
     } 
    } 
} 
</script> 

私は私の見解でこれをやって試してみました: これは、コンポーネントファイルです

<image-upload :image="/uploads/{{ $magazine->image }}"></image-upload> 

しかし、私はエラーを取得:

[Vue warn]: failed to compile template ...invalide expression

更新を:

回答として提案したとおりディレクティブから:を移動し、それが働いていたが、私は、コンソールになりました警告メッセージが表示されます:

[Vue warn]: The data property "image" is already declared as a prop. Use prop default value instead. (found in component)

+0

イメージディレクティブから ':'を削除してみます。これは文字列であるため、JavaScriptの表現として処理する必要はありません。 "' –

+0

はい、それが助けになりました!今は動作しますが、コンソールに警告メッセージが表示されますが、これを取り除く方法は分かりますか?[Vue警告]:データプロパティ "image"は既に小道具として宣言されています。代わりにデフォルトの値を使用してください。 (コンポーネントにあります) – Marco

答えて

4

小道具警告がある、あなたのデータプロパティにイメージを持っているので

data() { 
    return { 
    image: '', 
    formData:new FormData(), 
    file: null 
    } 
}, 

必要にそれを削除して小道具のプロパティに追加してください。

props: { 
    image: { 
     type: String, 
     default: "" 
    } 
}, 
data() { 
    return { 
    formData: new FormData(), 
    file: null 
    } 
}, 
+0

ありがとう! 'vue.js?0598:2574 [Vue警告]:親コンポーネントが再レンダリングするたびに値が上書きされるので、プロップを直接変更しないでください。代わりに、小道具の値に基づいてデータまたは計算されたプロパティを使用します。プロップが変更されました: "image"(コンポーネントにあります) ' – Marco

+1

これはあなたが' this.image = '' 'をイメージに置いているためでしょう。それはローディング時にイメージの小道具に割り当てられ、次に内部的に更新されるデータまたは計算値を持っていた方が好きです。これは、仮想仮想DOMが再描画されるときに上書きされるイメージ値を停止します。 –

+0

問題がなければ、それを行う方法のコード例を教えてください。現在のところ、更新フォームに画像をアップロードすることはできません。私はそれについての質問を投稿しました[ここ](http://stackoverflow.com/questions/40057627/vue-laravel-uploading-a-file-on-update-doesnt-work) – Marco

関連する問題