tuomasvaltanen

Untitled

Apr 7th, 2022 (edited)
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.63 KB | None | 0 0
  1. // vue-ohjelmointia, luento 7.4
  2.  
  3. <script setup>
  4. // Tuodaan vue:sta ref, eli funktio reaktiivisen datan luomiseksi
  5. import { ref } from 'vue';
  6.  
  7. // reaktiivinen lista julkaisudataa
  8. // jos tämä muuttuu, päivitetään sisältö automaattisesti ulkoasuun
  9. const publications = ref([])
  10.  
  11. // Tehdään asynkroninen funktio jotta voidaan
  12. // käsitellä ei-tosiaikaista dataa
  13. const getAllPublications = async () => {
  14. // Haetaan selaimen fetch työkalua käyttämällä data kurssiprojektin REST rajapinnasta.
  15. // Asetetaan vastaus response nimiseen muuttujaan, kun await on saanut vastauksen palvelimelta
  16. const response = await fetch('TÄHÄN SE RAJAPINNAN HTTPS-OSOITE/api/publications')
  17.  
  18. // muutetaan data JSON -muotoon
  19. const data = await response.json()
  20.  
  21. // pistetään data talteen reaktiiviseen publications-muuttujaan (päivittää automaattisesti ulkoasun)
  22. publications.value = data.publications
  23. }
  24.  
  25. // kutsutaan funktiota joka hakee rajapinnasta dataa
  26. getAllPublications()
  27.  
  28. </script>
  29.  
  30. <template>
  31. <h1>PublicationViewAll OK!</h1>
  32. <div class="container">
  33. <div class="item" v-for="publication, key in publications" :key="key">
  34. <img :src="publication.url" />
  35. </div>
  36. </div>
  37. </template>
  38.  
  39. <style scoped>
  40. img {
  41. width: 400px;
  42. }
  43.  
  44. .item {
  45. display: flex;
  46. flex-direction: column;
  47. align-items: center;
  48. background: gray;
  49. padding-top: 40px;
  50. padding-bottom: 40px;
  51. margin-bottom: 20px;
  52. }
  53.  
  54. .container {
  55. display: flex;
  56. flex-direction: column;
  57. align-items: center;
  58. }
  59.  
  60. body {
  61. margin: 30px;
  62. }
  63. </style>
  64.  
  65. // ternary eli ternääri-operaattoria voidaan käyttää yksinkertaisten if/else-rakenteiden sijasta
  66.  
  67. {{ publication.title }}
  68. <img :src="publication.url" />
  69. {{ publication.owner ? publication.owner.username : 'Anonyymi' }}
  70.  
  71. Tässä tapauksessa, "jos publication.owner EI OLE NULL, tulostetaan owner.username, jos on null, tulostetaan "Anonyymi"
  72.  
  73.  
  74. // voidaan käyttää ref:n sijasta, hyväksyy ainoastaan JS-objektin parametriksi
  75. // ref hyväksyy kaikki muut tietotyypit
  76. const state = reactive({
  77. error: false
  78. })
  79.  
  80. // Tehdään asynkroninen funktio jotta voidaan
  81. // käsitellä ei-tosiaikaista dataa
  82. const getAllPublications = async () => {
  83.  
  84. try {
  85. // Haetaan selaimen fetch työkalua käyttämällä data kurssiprojektin REST rajapinnasta.
  86. // Asetetaan vastaus response nimiseen muuttujaan, kun await on saanut vastauksen palvelimelta
  87. const response = await fetch('API OSOITE TÄHÄN/api/publications')
  88.  
  89. // muutetaan data JSON -muotoon
  90. const data = await response.json()
  91.  
  92. // jos tulee jotain muutakuin 200 OK
  93. if (response.status > 300) {
  94.  
  95. if (response.status == 404) {
  96. throw new Error("Dataa ei löytynyt.")
  97. }
  98.  
  99. throw new Error(data.msg)
  100. }
  101.  
  102. // pistetään data talteen reaktiiviseen publications-muuttujaan (päivittää automaattisesti ulkoasun)
  103. publications.value = data.publications
  104. } catch (e) {
  105. //console.log(e)
  106. state.error = true
  107. }
  108.  
  109. }
  110.  
  111. // tehdään ensin uusi component, eli PublicationView.vue. tämän tarkoitus on esittää yhtä yksittäistä kuvaa listassa
  112. <script setup>
  113. // jotta tämä komponentti voi ottaa vastaan dataa
  114. // tarvitaan definePropsia
  115. defineProps({
  116. publication: Object
  117. })
  118.  
  119. </script>
  120.  
  121. <template>
  122. {{ publication.title }}
  123. <img :src="publication.url" />
  124. {{ publication.owner ? publication.owner.username : 'Anonyymi' }}
  125. </template>
  126.  
  127. <style scoped>
  128. img {
  129. width: 400px;
  130. }
  131. </style>
  132.  
  133. // siirretään kaikki yksittäisen kuvan koodi uuteen komponenttiin
  134. // musita lisätä ylös import:
  135. import PublicationView from './PublicationView.vue';
  136.  
  137. // tämän jälkeen, PublicationViewAll näyttää tältä:
  138.  
  139. <template>
  140. <h1>PublicationViewAll OK!</h1>
  141. <div v-if="state.error">Valitettavasti datan lataaminen ei onnistunut.</div>
  142. <div v-else class="container">
  143. <div class="item" v-for="publication, key in publications" :key="key">
  144. <!-- ladataan uusi komponentti, ja annetaan sille publication-objekti käytettäväksi -->
  145. {{ key + 1 }}
  146. <PublicationView :publication="publication"></PublicationView>
  147. </div>
  148. </div>
  149. </template>
  150.  
  151. // voi olla hyvä idea laittaa PublicationViewin sisältö omaan diviinsä, niin voidaan muokata myös tekstien tyylejä
  152.  
  153. <script setup>
  154.  
  155. defineProps({
  156. publication: Object
  157. })
  158.  
  159. </script>
  160.  
  161. <template>
  162. <div class="item">
  163. {{ publication.title }}
  164. <img :src="publication.url" />
  165. {{ publication.owner ? publication.owner.username : 'Anonyymi' }}
  166. </div>
  167. </template>
  168.  
  169. <style scoped>
  170. .item {
  171. font-family: "Arial";
  172. font-size: 14pt;
  173. }
  174.  
  175. img {
  176. width: 400px;
  177. }
  178. </style>
  179.  
  180. // vue-router pitää ensin asentaa:
  181. // npm install vue-router@4
  182.  
  183. // main.js
  184.  
  185. import { createApp } from 'vue'
  186. import { createRouter, createWebHistory } from 'vue-router'
  187. import App from './App.vue'
  188. import PublicationViewAll from './components/publication/PublicationViewAll.vue'
  189.  
  190. const router = createRouter({
  191. history: createWebHistory(),
  192. routes: [
  193. {
  194. path: "/",
  195. name: "Julkaisut",
  196. component: PublicationViewAll
  197. }
  198. ]
  199. })
  200.  
  201. createApp(App).use(router).mount('#app')
  202.  
  203. // App.vue
  204.  
  205. <script setup>
  206.  
  207. import { RouterView } from 'vue-router'
  208.  
  209. </script>
  210.  
  211. <template>
  212. <router-view></router-view>
  213. </template>
  214.  
  215. <style>
  216. </style>
  217.  
  218. // tehdään uusi component jotta voimme testata toista route
  219. // uusi kansio components-kansioon => user, ja sinne uus tiedosto UsersView.vue
  220.  
  221. <script setup>
  222. </script>
  223.  
  224. <template>
  225. <h1>Users</h1>
  226. </template>
  227.  
  228. <style>
  229. </style>
  230.  
  231. // router ja main.js kannattaa eriyttää omiin tiedostoihin
  232.  
  233. // tee uusi tiedosto, router.js src-kansioon
  234.  
  235. // router.js, huomaa export const router
  236.  
  237. import { createRouter, createWebHistory } from 'vue-router'
  238. import PublicationViewAll from './components/publication/PublicationViewAll.vue'
  239. import UsersView from './components/user/UsersView.vue'
  240.  
  241. export const router = createRouter({
  242. history: createWebHistory(),
  243. routes: [
  244. {
  245. path: "/",
  246. name: "Julkaisut",
  247. component: PublicationViewAll
  248. },
  249. {
  250. path: "/users",
  251. name: "Käyttäjät",
  252. component: UsersView
  253. }
  254. ]
  255. })
  256.  
  257. // main.js
  258.  
  259. import { createApp } from 'vue'
  260. import App from './App.vue'
  261. import { router } from './router'
  262.  
  263. createApp(App).use(router).mount('#app')
  264.  
Add Comment
Please, Sign In to add comment