Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Para quem se aventura no vee-validate versao 3.x (jun/2020)

Boa tarde. Segue a solução para os colegas de classes que estejam utilizando a ultima versão do validate até esta data. Note que a estrutura mudou um pouco comparando com o que foi ensinado na video aula, todavia, no final se obtem o mesmo resultado =)

No meu projeto, esta são as versões das dependencias utilizadas...

"dependencies": {
    "vee-validate": "^3.3.5",
    "vue": "^2.5.11",
    "vue-resource": "^1.5.1",
    "vue-router": "^3.3.4"
  },

Após baixar via NPM o VeeValidate, importe-o no arquivo main.js

import { ValidationProvider, extend, ValidationObserver } from 'vee-validate';

Explicação: ValidationProvider é o componente em si do validador; O extend provém os métodos/tipos de validação Ex.:min, max, required; ValidationObserver será usado no momento do clique do botao 'gravar' pelo usuario. [Em outras palavras, só será gravado se tds as validações estiverem OK]

Abaixo, o código referente aos tipos de validações...

extend('required', {
  validate (value) {
    return {
      required: true,
      valid: ['', null, undefined].indexOf(value) === -1
    };
  },
  computesRequired: true,
  message: 'Este campo é obrigatório!'
});

/* Ou... Vc pode fazer o required assim. Neste caso, é necessario importa-lo de rules. 
import { required} from 'vee-validate/dist/rules';

extend('required', {
  ...required,
  message: 'This field is required'
}); */

extend('minmax', {
  validate(value, { min, max }) {
    return value.length >= min && value.length <= max;
  },
  params: ['min', 'max'],
  message:'O campo {_field_} deve possuir no mínimo {min} e no máximo {max} caracteres.'

});

Por fim, registre-o os componentes globalmente... [È assim q vc vai poder usar as tags no template

//tais componentes serao usados como TAGS nos templates!
Vue.component('ValidationProvider', ValidationProvider);
Vue.component('ValidationObserver', ValidationObserver);
2 respostas
solução!

Fala ai Adailton, tudo bem? Obrigado por compartilhar a solução, provavelmente tem de a ajudar muitos alunos, parabéns pela solução.

Abraços e bons estudos.

Por fim, e ñ menos importante... No arquivo Cadastro.vue:

  <div>
    <h1 v-if="foto._id" class="centralizado">Alteração</h1>
    <h1 v-else class="centralizado">Cadastro</h1>

    <validationObserver v-slot="{ handleSubmit }">
      <form @submit.prevent="handleSubmit(grava)"> 

        <div class="controle">
          <label for="titulo">TÍTULO</label>

          <validation-provider rules="required|minmax:3,20" :bails="false" v-slot="{ errors }">
            <input v-model="foto.titulo" id="titulo" vid="titulo" name="título" autocomplete="off" />
            <!-- <ul>
            CASO EU QUEIRA LISTAR TDS OS ERROS P/ O USUARIO DE UMA SO VEZ!  
              <li v-for="error in errors" v-bind:key="error">
                <span class="erro" >{{ error }}</span>  
              </li>
            </ul>-->
            <span class="erro">{{ errors[0] }}</span>
          </validation-provider>
        </div>

        <div class="controle">
          <label for="url">URL</label>

          <validation-provider rules="required" v-slot="{ errors }">
            <input v-model.lazy="foto.url" id="url" autocomplete="off" name="url" />
            <span class="erro">{{ errors[0] }}</span>
          </validation-provider>
          <imagem-responsiva v-show="foto.url" :url="foto.url" :titulo="foto.titulo" />
          <!--v-show: defino que só será exibida a url e titulo quando o valor de foto.url for diferente de branco! -->
        </div>

        <div class="controle">
          <label for="descricao">DESCRIÇÃO</label>
          <textarea v-model="foto.descricao" id="descricao" autocomplete="off"></textarea>
        </div>

        <div class="centralizado">
          <meu-botao rotulo="GRAVAR" tipo="submit" />
          <router-link :to="{name: 'home'}">
            <meu-botao rotulo="VOLTAR" tipo="button" />
          </router-link>
        </div>
      </form>
    </validationObserver>
  </div>
</template>

Observe que o ValidationObserver ficou no lugar daquele codigo que o professor havia criado no metodo grava()

this.$validator
          .validateAll()
          .then(success => {
            if(success) {

POrtanto, vemos que ''no final das coisas'' ele ficou bem mais enxuto:

 methods: {
    grava() {
      this.service.cadastra(this.foto).then(
        () => {
          if (this.id)
            //se tem id, é pq tratou-se de um update, então, após a gravação, retorne p/ tela inicial
            this.$router.push({ name: "home" }); //O VueRouter disponibiliza no global view instance o objeto $router que possui o push. serve p/ redirecionar p/ alguma pagina

          this.foto = new Foto(); //caso o if de cima for falso, apenas os campos da tela serão zerados e o usuario permanece na pagina.
        },
        err => console.log(err)
      );
    }
  },