#javascript #html #vue.js
#javascript #HTML #vue.js
Вопрос:
Я использую Axios для извлечения JSON из внешнего API и создания шаблона счета в HTML. Мои другие части запроса работают нормально. Но в этой части Vue выдает ошибку, что «свойство не определено». Я попытался перенести html-код между тегом script, а также попытался windows.onload()
запустить свой скрипт перед загрузкой страницы, но таким образом ошибка была выведена в другом направлении.
Вот мой код Vue
<script>
$(document).on('click', '#btn_print', function(){
var app3 = new Vue({
el: '#app3',
data: {
printOrders: []
},
mounted: function() {
this. printExtraBill()
},
methods: {
printExtraBill() {
axios.get(`https://staging/wp-json/wc/v3/orders/137?
consumer_key=ck_123amp;consumer_secret=cs_456`)
.then(response => {
this.printOrders = response.data;
console.log(response);
})
.catch(error => {
console.log(error);
});
}
}
});
}
</script>
Вот моя HTML-часть
<div class ="container mt-5" id="app3">
<div id="printToday" style="border:3px solid black">
<h2 align="center">Name</h2>
<h4 align="center">Address and Mobile</h4>
<p v-for="orders, index in printOrders" id="getName">Id: {{orders.number}} <br>
{{orders.date_created}} <br>
{{orders.billing.first_name " " orders.billing.last_name }}
</p>
<div>
<h3 class="thick" v-for="(orders, index) in printOrders" id="total">
Total : {{orders.total}} </br> Method : {{orders.payment_method_title}}</h3>
Ошибка
Vue warn]: Error in render: "TypeError: Cannot read property 'first_name' of undefined"
vue.js:1897 TypeError: Cannot read property 'first_name' of undefined
at eval (eval at createFunction (vue.js:11649), <anonymous>:3:568)
at Proxy.renderList (vue.js:2658)
at Proxy.eval (eval at createFunction (vue.js:11649), <anonymous>:3:359)
at Vue._render (vue.js:3551)
at Vue.updateComponent (vue.js:4067)
at Watcher.get (vue.js:4478)
at Watcher.run (vue.js:4553)
at flushSchedulerQueue (vue.js:4311)
at Array.<anonymous> (vue.js:1989)
at flushCallbacks (vue.js:1915)
Пожалуйста, любая помощь…..
Комментарии:
1. не могли бы вы также включить полную трассировку стека ошибок?
2. Привет @Dipen Shah, я только что прикрепил ошибку с вопросом
3. Похоже
billing
, что свойство равно нулю для заказов, вы можете это проверить?4. Нет, я проверил это, на самом деле я получаю данные JSON, заполненные каждым элементом, который я определил….
5. Я сомневаюсь в этом, не могли бы вы
printOrders
также включить объект JSON в свой вопрос?
Ответ №1:
Я очень сомневаюсь, что ваше billing
свойство всегда определено, но если вы так скажете, следующее должно быть в состоянии решить вашу проблему:
<p v-for="orders, index in printOrders" id="getName">Id: {{orders.number}} <br>
{{orders.date_created}}
<br />
<span v-if="orders.billing">
{{orders.billing.first_name " " orders.billing.last_name }}
<span>
</p>
Комментарии:
1. Привет @Dipen Shah, спасибо за ответ. Я получаю данные JSON, определенные для этого порядка, я могу просмотреть их в консоли. Но когда я использовал v-if, как вы сказали, я получаю еще одно неопределенное свойство для вложенного массива. Я думаю, что я делаю что-то не так, когда использую экземпляр Vue. Просто для вопроса, мы можем правильно использовать несколько экземпляров Vue. Это мой третий экземпляр Vue, обрабатывающий этот конкретный запрос Get.
2. @Tom Я не уверен, что вы подразумеваете под несколькими экземплярами Vue, несколько компонентов vue определенно поддерживаются.
3. Может быть, если вы можете поделиться codesandbox / stackblitz, я смогу помочь дальше.
4. Я сделал то же самое, чтобы заполнить другую таблицу на той же странице с помощью запроса Axios. Только для этой части я получаю эту проблему…
5. Я вижу, но, не глядя на данные, я не уверен, с чем я могу помочь, поскольку проблема, похоже, связана с неопределенным значением свойства, может быть, вы можете отладить свой JS и посмотреть, в чем проблема.
Ответ №2:
Измените mounted
жизненный created
цикл следующим образом:
async created(){
await this.printExtraBill()
}
mounted
Перехват не вызывается при загрузке страницы, поэтому реквизиты данных не будут установлены: https://v3.vuejs.org/api/options-lifecycle-hooks.html#mounted
Этот перехват не вызывается во время рендеринга на стороне сервера.
Комментарии:
1. Спасибо за ваш ответ. Но все же я получаю сообщение об ошибке «Неопределенное свойство»…
2. @Tom Основываясь на вашей трассировке стека, похоже, что некоторые заказы могут не получать
billing
prop или получать его какnull
. Попробуйте добавить проверку, чтобы проверить наличие null перед его печатью.{{orders.billing ? orders.billing.first_name " " orders.billing.last_name: '-' }}
3. Я просто получаю только один заказ для целей тестирования, для этого заказа я также получаю имя и другие элементы…