Javascript 根据所选州显示城市

Javascript 根据所选州显示城市,javascript,php,laravel,vuetify.js,Javascript,Php,Laravel,Vuetify.js,我是Vuetify和Laravel的新手,我面临着根据所选州有条件地渲染城市的问题。 我只想显示所选州的城市,但它总是渲染所有州的城市。 分别在选择州(Estado)和城市(Cidade)后调用下面的函数 data () { return { salvando: false, loading: true, maskCpf: '##.###.###/####-##', maskTelRes: '(##) ####-####', maskCep:

我是Vuetify和Laravel的新手,我面临着根据所选州有条件地渲染城市的问题。 我只想显示所选州的城市,但它总是渲染所有州的城市。 分别在选择州(Estado)和城市(Cidade)后调用下面的函数

    data () {
  return {
    salvando: false,
    loading: true,
    maskCpf: '##.###.###/####-##',
    maskTelRes: '(##) ####-####',
    maskCep: '#####-###',
    emailRules: [v => /.+@.+/.test(v) || 'E-mail invalido'],
    requiredRules: [v => !!v || '* Obrigatório'],
    valid: null,
    disableCidade: '',
    primeiroAcesso: '',
    btnNome: !this.$route.params.codAgroindustria ? 'Salvar' : 'Salvar Alterações',
    form: {
      codAgroindustria: null, // codigo da agroindústria
      NomeFantasia: '',
      RazaoSocial: '',
      Porte: '',
      Cnpj: '',
      estado: '',
      CodEstado: '',
      cidade: '',
      Logradouro: '',
      Numero: '',
      Bairro: '',
      Complemento: '',
      Cep: '',
      TelRes: '',
      email: '',
      // captacao: '',
      // fornecedores: '',
    },
    estado: [{ nome: 'Carregando', id: 0 }],
    cidade: [{ nome: 'Carregando', id: 0 }],
    cadastro: this.$route.params.codAgroindustria === 0 ? 1 : 0,
  }
},
created () {
  // console.log(this.$route.params.codAgroindustria)
  if (this.$route.params.codAgroindustria === undefined) {
    // console.log('Indefinido')
    this.$router.push({ name: 'Listar Agroindustrias' })
  } else if (this.$route.params.codAgroindustria !== 0) {
    // console.log('edicao')
    this.form.codAgroindustria = this.$route.params.codAgroindustria
    this.formDados()
  } else {
    // console.log('cadastro')
    this.loadNewForm()
  }
},
methods: {
  loadNewForm () {
    if (this.$route.params.NomeFantasia !== 'undefined') {
      this.form.NomeFantasia = this.$route.params.NomeFantasia
    }
    if (this.$route.params.Cnpj !== 'undefined') {
      this.form.Cnpj = this.$route.params.Cnpj
    }
    if (this.$route.params.primeiroAcesso === 1) {
      this.primeiroAcesso = 1
    } else {
      this.primeiroAcesso = 0
    }
    this.loading = false
    this.loadEstado()
  },
  updateProfile () {
    this.$refs.form.validate()
    if (!this.valid) {
      this.Swal.fire('Atenção', 'Preencha os itens obrigatórios sinalizados com ("*").', 'warning')
    } else {
      this.salvando = true
      if (this.form.codAgroindustria) { // ATUALIZAR DADOS AGROINDUSTRIA
        this.alert = false
        this.api.put('/agroindustria/attAgroindustria', this.form)
          .then(response => {
            this.salvando = false
            if (response.data.error) {
              let erros = ''
              response.data.message.forEach((el) => {
                erros += el + '<br/>'
              })
              this.Swal.fire({
                title: 'Corrija os erros abaixo:',
                icon: 'warning',
                html: erros,
              })
            } else {
              this.Swal.fire('Sucesso', 'Cadastro Realizado', 'success')
              this.$router.push({ name: 'Listar Agroindustrias' })
            }
          }).catch(error => {
            this.salvando = false
            this.Swal.fire({
              title: 'Atenção:',
              icon: 'warning',
              html: error,
            })
          })
      } else { // CRIAR NOVA AGROINDUSTRIA
        console.log(this.form)
        this.api.post('/agroindustria/createAgroindustria', this.form, this.primeiroAcesso)
          .then(response => {
            this.salvando = false
            if (response.data.error) {
              let erros = ''
              response.data.message.forEach((el) => {
                erros += el + '<br/>'
              })
              this.Swal.fire({
                title: 'Corrija os erros abaixo:',
                icon: 'warning',
                html: erros,
              })
            } else {
              this.Swal.fire('Sucesso', 'Cadastro Realizado.', 'success')
              this.$router.push({ name: 'Listar Agroindustrias' })
            }
          }).catch(error => {
            console.log(error)
            this.salvando = false
            this.Swal.fire({
              title: 'Atenção:',
              icon: 'warning',
              html: error + '<br/>Algo de errado não está certo.',
            })
          })
      }
    }
  },
  formDados () {
    this.api('/agroindustria/', {
      params: {
        codAgroindustria: this.form.codAgroindustria,
      },
    })
      .then(response => {
        this.form.NomeFantasia = response.data[0].NomeFantasia
        this.form.RazaoSocial = response.data[0].RazaoSocial
        this.form.Porte = response.data[0].Porte
        this.form.Cnpj = response.data[0].Cnpj
        this.form.estado = response.data[0].estado
        this.form.CodEstado = response.data[0].estado.CodEstado
        this.form.cidade = response.data[0].cidade
        this.form.Logradouro = response.data[0].Logradouro
        this.form.Numero = response.data[0].Numero
        this.form.Bairro = response.data[0].Bairro
        this.form.Cep = response.data[0].Cep
        this.form.Complemento = response.data[0].Complemento
        this.form.TelRes = response.data[0].TelRes
        this.form.email = response.data[0].email
        this.loadEstadoEdit(response.data[0].estado, response.data[0].cidade)
      }).catch(error => {
        this.message = error
        // console.log(this.message)
      })
  },
  formTelefone (TelRes) {
    for (let i = 0; i < TelRes.length; i++) {
      switch (TelRes[i].CodTipoTelefone) {
        case '1':
          this.form.telCel = TelRes[i].DDD ? '' + TelRes[i].DDD + TelRes[i].Numero : null
          break
        case '2':
          this.form.telCome = TelRes[i].DDD ? '' + TelRes[i].DDD + TelRes[i].Numero : null
          break
        default:
          this.form.telReca = TelRes[i].DDD ? '' + TelRes[i].DDD + TelRes[i].Numero : null
          break
      }
    }
  },
  loadEstado () {
    this.api('/estado').then(response => {
      // console.log(this.response.data.estado)
      this.estado = response.data.estado.map(el => el.Nome)
    }).catch(error => {
      this.message = error
      // console.log(this.message)
    })
  },
  loadCidade (CodEstado) {
    this.api('/cidade', {
      params: {
        CodEstado: CodEstado,
      },
    })
      .then(response => {
        this.cidade = response.data.cidade.map(el => el.Nome)
        this.disableCidade = false
        // console.log(this.cidade)
      }).catch(error => {
        this.message = error
      // console.log(this.message)
      })
  },
  loadEstadoEdit (CodEstado, CodCidade) {
    this.api('/estado').then(response => {
      this.estado = response.data.estado
      this.form.estado = this.estado
      this.form.CodEstado = this.estado.CodEstado
      this.form.estado = this.form.estado[CodEstado - 1]
      this.loadCidadeEdit(CodCidade)
      // console.log(response)
    }).catch(error => {
      this.message = error
      // console.log(this.message)
    })
  },
  loadCidadeEdit (CodCidade) {
    this.api('/cidade').then(response => {
      this.cidade = response.data.cidade
      this.form.cidade = this.cidade[CodCidade - 1]
      this.disableCidade = false
      this.loading = false
      // console.log(response.data.cidade)
    }).catch(error => {
      this.message = error
      // console.log(this.message)
    })
  },
  changeCidade () {
    console.log(this.form.estado)
    this.loadCidade(this.form.estado.CodEstado)
    // console.log(this.company.estado)
  },
},
前端的My Vuetify代码:

<template>
  <v-card
    class="ma-3"
  >
    <div class="content">
      <template>
        <v-card
          :class="{ 'card-success': cadastro, 'card-warn': !cadastro}"
          style="min-height: 60vh"
        >
          <h4
            v-if="!cadastro"
            slot="header"
            class="card-title text-center"
          >
            Edição de Agroindústria
          </h4>
          <h4
            v-else
            slot="header"
            class="card-title text-center"
          >
            Cadastro de Agroindústria
          </h4>
          <div class="clearfix" />
          <div
            v-if="loading"
            style="height: 60vh"
          >
            <v-row
              class="fill-height ma-2 flex-column"
              align="center"
              justify="center"
            >
              <v-progress-circular
                :size="70"
                color="primary"
                indeterminate
              />
            </v-row>
          </div>
          <div v-if="!loading">
            <v-form
              id="form"
              ref="form"
              v-model="valid"
              class="pa-3"
              lazy-validation
              @submit.prevent="updateProfile"
            >
              <v-card>
                <v-list-item-content>
                  <v-card-title
                    class="headline mx-auto"
                  >
                    Dados Pessoais
                  </v-card-title>
                  <v-row
                    v-if="!loading"
                    class="pa-3"
                  >
                    <!-- <v-col
                      cols="12"
                    >
                      <v-text-field
                        v-model="form.Nome"
                        label="Nome *"
                        :rules="requiredRules"
                      />
                    </v-col> -->
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.NomeFantasia"
                        label="Nome Fantasia *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.RazaoSocial"
                        label="Razão Social *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Porte"
                        label="Porte *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Cnpj"
                        v-mask="maskCpf"
                        label="CNPJ *"
                        :rules="requiredRules"
                        return-masked-value
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-autocomplete
                        v-model="form.estado"
                        label="Estado"
                        name="estado_agroindustria"
                        :items="estado"
                        item-text="nome"
                        item-value="id"
                        @change="changeCidade"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-autocomplete
                        v-model="form.cidade"
                        label="Cidade"
                        :items="cidade"
                        item-text="nome"
                        item-value="id"
                        :disabled="disableCidade"
                      />
                    </v-col>
                    <v-col
                      cols="4"
                    >
                      <v-text-field
                        v-model="form.Logradouro"
                        label="Logradouro"
                      />
                    </v-col>
                    <v-col
                      cols="2"
                    >
                      <v-text-field
                        v-model="form.Numero"
                        label="Numero"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Bairro"
                        label="Bairro *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Complemento"
                        label="Complemento"
                      />
                    </v-col>
                    <v-col
                      cols="3"
                    >
                      <v-text-field
                        v-model="form.Cep"
                        v-mask="maskCep"
                        :rules="requiredRules"
                        label="CEP *"
                      />
                    </v-col>
                    <v-col
                      cols="3"
                    >
                      <v-text-field
                        v-model="form.TelRes"
                        v-mask="maskTelRes"
                        label="Telefone"
                        type="tel"
                        return-masked-value
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.email"
                        :rules="emailRules"
                        label="E-mail"
                        type="email"
                        return-masked-value
                      />
                    </v-col>
                  </v-row>
                </v-list-item-content>
              </v-card>
              <!-- <v-card>
                <v-list-item-content>
                  <v-card-title
                    class="headline mx-auto"
                  >
                    Dados Técnicos
                  </v-card-title>
                  <v-row
                    v-if="!loading"
                    class="pa-3"
                  >
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.captacao"
                        label="Captação"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.fornecedores"
                        label="Fornecedores"
                      />
                    </v-col>
                  </v-row>
                </v-list-item-content>
              </v-card> -->
              <v-btn
                type="submit"
                :disabled="salvando"
                :loading="salvando"
                :color="!$route.params.codAgroindustria ? 'success' : 'warning'"
                form="form"
              >
                {{ btnNome }}
              </v-btn>

              <router-link
                :disabled="salvando"
                to="listar-agroindustrias"
              >
                <v-btn
                  :disabled="salvando"
                  color="error"
                  class="ml-3"
                >
                  Cancelar
                </v-btn>
              </router-link>
            </v-form>
          </div>
        </v-card>
      </template>
    </div>
  </v-card>
</template>

埃迪昂农业学院
农业地籍
护墙板
{{btnNome}}
取消者

Done@ChrisBaker+1改进您的问题,太好了!我对vuetify不太熟悉,也没有什么比这更明显的了,希望更熟悉你的堆栈的人能帮我一把。我建议确保您获得了
$CodEstado
,这似乎是在另一个块中获得了所有()。我会使用浏览器开发工具来确保前端正在发布它,
changeCidade
中的代码让我怀疑——它应该是
this.form.CodEstado
吗?检查post数据,查看值是否已过帐。如果是,问题在后端,如果不是,问题在前端。@ChrisBaker感谢您的回复!我现在正在学习如何使用StackOverflow,你们真的帮助了我。至于您的考虑,我创建了另外两种方法,但在这方面仍然没有成功。我将再次更新我的问题代码,以便您可以看到我的所有代码。解决了它!非常感谢你!您应该将您的解决方案作为答案发布。这有助于网站建立解决方案目录,这也是本文的目标。4年后的某一天,有人会处理这个问题,找到你的帖子。如果他们在这里得到的唯一一件事就是你解决了你的问题,那就太令人沮丧了。。。。他们会想知道怎么做的!告诉他们:)
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Estado;

class EstadoController extends Controller
{

    public function getEstado()
    {
        $estado = Estado::all();

        return response()->json([
            'error' => false,
            'estado' => $estado
        ]);
    }

}
<template>
  <v-card
    class="ma-3"
  >
    <div class="content">
      <template>
        <v-card
          :class="{ 'card-success': cadastro, 'card-warn': !cadastro}"
          style="min-height: 60vh"
        >
          <h4
            v-if="!cadastro"
            slot="header"
            class="card-title text-center"
          >
            Edição de Agroindústria
          </h4>
          <h4
            v-else
            slot="header"
            class="card-title text-center"
          >
            Cadastro de Agroindústria
          </h4>
          <div class="clearfix" />
          <div
            v-if="loading"
            style="height: 60vh"
          >
            <v-row
              class="fill-height ma-2 flex-column"
              align="center"
              justify="center"
            >
              <v-progress-circular
                :size="70"
                color="primary"
                indeterminate
              />
            </v-row>
          </div>
          <div v-if="!loading">
            <v-form
              id="form"
              ref="form"
              v-model="valid"
              class="pa-3"
              lazy-validation
              @submit.prevent="updateProfile"
            >
              <v-card>
                <v-list-item-content>
                  <v-card-title
                    class="headline mx-auto"
                  >
                    Dados Pessoais
                  </v-card-title>
                  <v-row
                    v-if="!loading"
                    class="pa-3"
                  >
                    <!-- <v-col
                      cols="12"
                    >
                      <v-text-field
                        v-model="form.Nome"
                        label="Nome *"
                        :rules="requiredRules"
                      />
                    </v-col> -->
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.NomeFantasia"
                        label="Nome Fantasia *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.RazaoSocial"
                        label="Razão Social *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Porte"
                        label="Porte *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Cnpj"
                        v-mask="maskCpf"
                        label="CNPJ *"
                        :rules="requiredRules"
                        return-masked-value
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-autocomplete
                        v-model="form.estado"
                        label="Estado"
                        name="estado_agroindustria"
                        :items="estado"
                        item-text="nome"
                        item-value="id"
                        @change="changeCidade"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-autocomplete
                        v-model="form.cidade"
                        label="Cidade"
                        :items="cidade"
                        item-text="nome"
                        item-value="id"
                        :disabled="disableCidade"
                      />
                    </v-col>
                    <v-col
                      cols="4"
                    >
                      <v-text-field
                        v-model="form.Logradouro"
                        label="Logradouro"
                      />
                    </v-col>
                    <v-col
                      cols="2"
                    >
                      <v-text-field
                        v-model="form.Numero"
                        label="Numero"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Bairro"
                        label="Bairro *"
                        :rules="requiredRules"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.Complemento"
                        label="Complemento"
                      />
                    </v-col>
                    <v-col
                      cols="3"
                    >
                      <v-text-field
                        v-model="form.Cep"
                        v-mask="maskCep"
                        :rules="requiredRules"
                        label="CEP *"
                      />
                    </v-col>
                    <v-col
                      cols="3"
                    >
                      <v-text-field
                        v-model="form.TelRes"
                        v-mask="maskTelRes"
                        label="Telefone"
                        type="tel"
                        return-masked-value
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.email"
                        :rules="emailRules"
                        label="E-mail"
                        type="email"
                        return-masked-value
                      />
                    </v-col>
                  </v-row>
                </v-list-item-content>
              </v-card>
              <!-- <v-card>
                <v-list-item-content>
                  <v-card-title
                    class="headline mx-auto"
                  >
                    Dados Técnicos
                  </v-card-title>
                  <v-row
                    v-if="!loading"
                    class="pa-3"
                  >
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.captacao"
                        label="Captação"
                      />
                    </v-col>
                    <v-col
                      cols="6"
                    >
                      <v-text-field
                        v-model="form.fornecedores"
                        label="Fornecedores"
                      />
                    </v-col>
                  </v-row>
                </v-list-item-content>
              </v-card> -->
              <v-btn
                type="submit"
                :disabled="salvando"
                :loading="salvando"
                :color="!$route.params.codAgroindustria ? 'success' : 'warning'"
                form="form"
              >
                {{ btnNome }}
              </v-btn>

              <router-link
                :disabled="salvando"
                to="listar-agroindustrias"
              >
                <v-btn
                  :disabled="salvando"
                  color="error"
                  class="ml-3"
                >
                  Cancelar
                </v-btn>
              </router-link>
            </v-form>
          </div>
        </v-card>
      </template>
    </div>
  </v-card>
</template>