diff --git a/03-components/10-MeetupView/MeetupView.js b/03-components/10-MeetupView/MeetupView.js
index c2715d1..7f4025d 100644
--- a/03-components/10-MeetupView/MeetupView.js
+++ b/03-components/10-MeetupView/MeetupView.js
@@ -12,31 +12,43 @@ export default defineComponent({
components: {
UiAlert,
UiContainer,
+ MeetupAgenda,
+ MeetupDescription,
+ MeetupCover,
+ MeetupInfo
},
+ props: {
+ meetup: {
+ type: Array,
+ required: true,
+ },
+ },
+
template: `
-
+
Описание
+
Программа
-
+ Программа пока пуста...
+
diff --git a/03-components/20-UiClock/UiClock.js b/03-components/20-UiClock/UiClock.js
index 8215f32..2c3dd5a 100644
--- a/03-components/20-UiClock/UiClock.js
+++ b/03-components/20-UiClock/UiClock.js
@@ -1,9 +1,31 @@
-import { defineComponent } from 'vue'
+import { defineComponent, ref, onMounted, onUnmounted } from 'vue';
export default defineComponent({
name: 'UiClock',
- setup() {},
+ setup() {
+ const time = ref('');
- template: `10:12:02
`,
-})
+ const updateTime = () => {
+ const currentTime = new Date();
+ time.value = currentTime.toLocaleTimeString(navigator.language, { timeStyle: 'medium' });
+ };
+
+ let intervalId;
+
+ onMounted(() => {
+ updateTime();
+ intervalId = setInterval(updateTime, 1000);
+ });
+
+ onUnmounted(() => {
+ clearInterval(intervalId);
+ });
+
+ return {
+ time,
+ };
+ },
+
+ template: `{{ time }}
`,
+});
diff --git a/03-components/30-removable-emails/EmailList.js b/03-components/30-removable-emails/EmailList.js
index 7c8096e..627b3d0 100644
--- a/03-components/30-removable-emails/EmailList.js
+++ b/03-components/30-removable-emails/EmailList.js
@@ -15,13 +15,27 @@ export default defineComponent({
},
},
+ emits: ['remove-email'],
+
+ setup(props, { emit }) {
+
+ const removeEmailHandler = (index) => {
+ emit('removeEmail', index)
+ }
+
+ return {
+ removeEmailHandler
+ }
+ },
+
template: `
`,
diff --git a/03-components/30-removable-emails/EmailListItem.js b/03-components/30-removable-emails/EmailListItem.js
index c88ef26..a3629ef 100644
--- a/03-components/30-removable-emails/EmailListItem.js
+++ b/03-components/30-removable-emails/EmailListItem.js
@@ -15,10 +15,16 @@ export default defineComponent({
},
},
+ methods: {
+ handleRemove() {
+ this.$emit('remove-email');
+ }
+ },
+
template: `
{{ email }}
-
+
`,
})
diff --git a/03-components/30-removable-emails/MarkedEmailsApp.js b/03-components/30-removable-emails/MarkedEmailsApp.js
index 5e77151..f314c5c 100644
--- a/03-components/30-removable-emails/MarkedEmailsApp.js
+++ b/03-components/30-removable-emails/MarkedEmailsApp.js
@@ -42,6 +42,8 @@ export default defineComponent({
EmailList,
},
+
+
setup() {
const emails = ref(getEmails())
const query = ref('')
@@ -54,7 +56,7 @@ export default defineComponent({
})
function removeEmailByIndex(index) {
- emails.value.splice(index, 1)
+ emails.value.splice(index, 1);
}
return {
@@ -69,7 +71,7 @@ export default defineComponent({
-
+
`,
})
diff --git a/03-components/40-UiCounter/UiCounter.js b/03-components/40-UiCounter/UiCounter.js
index 48ae865..f3b7972 100644
--- a/03-components/40-UiCounter/UiCounter.js
+++ b/03-components/40-UiCounter/UiCounter.js
@@ -1,4 +1,4 @@
-import { defineComponent } from 'vue'
+import { defineComponent, ref, watch } from 'vue'
import { UiButton } from '@shgk/vue-course-ui'
import './UiCounter.css'
@@ -9,15 +9,73 @@ export default defineComponent({
UiButton,
},
- setup() {
+ props: {
+ count: {
+ type: Number,
+ required: true,
+ },
+
+ min: {
+ type: Number,
+ default: 0,
+ },
+
+ max: {
+ type: Number,
+ default: Infinity,
+ },
+ },
+
+ setup(props, { emit }) {
// Рекомендуется для практики реализовать обработку событий внутри setup, а не непосредственно в шаблоне
+ const counter = ref(props.count);
+
+ watch(
+ () => props.count,
+ (newCount) => {
+ counter.value = newCount;
+ }
+ );
+
+ const increment = () => {
+ if (counter.value < props.max) {
+ counter.value++;
+ }
+ };
+
+ const decrement = () => {
+ if (counter.value > props.min) {
+ counter.value--;
+ }
+ };
+
+ watch(counter, (newCount) => {
+ emit('update:count', newCount);
+ });
+
+
+ return {
+ counter,
+ increment,
+ decrement,
+ };
},
template: `
- ➖
- 3
- ➕
+
+ ➖
+
+ {{ counter }}
+
+ ➕
+
`,
})
diff --git a/03-components/50-weather-components/WeatherApp.js b/03-components/50-weather-components/WeatherApp.js
index 5fb34c3..a95ad86 100644
--- a/03-components/50-weather-components/WeatherApp.js
+++ b/03-components/50-weather-components/WeatherApp.js
@@ -1,52 +1,32 @@
-import { defineComponent } from 'vue'
+import { defineComponent, ref} from 'vue'
import { getWeatherData, WeatherConditionIcons } from './weather.service.ts'
import './WeatherApp.css'
+import WeatherList from './WeatherList.vue'
export default defineComponent({
name: 'WeatherApp',
+ components: { WeatherList },
+
+ setup() {
+ const weatherData = ref(getWeatherData())
+
+ return {
+ weatherData,
+ }
+ },
+
template: `
-
Погода в Средиземье
+
Погода в Средиземье
-
+
`,
})
diff --git a/03-components/50-weather-components/WeatherList.vue b/03-components/50-weather-components/WeatherList.vue
new file mode 100644
index 0000000..229c026
--- /dev/null
+++ b/03-components/50-weather-components/WeatherList.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+ ⚠️
+ {{ region.alert.sender_name }} {{ region.alert.description }}
+
+
+
{{ region.geographic_name }}
+
{{ region.current.dt }}
+
+
+
+ {{ weatherConditionIcons[region.current.weather.id] || '' }}
+
+
{{ kelvinToCelsius(region.current.temp) }} °C
+
+
+
+
Давление, мм рт. ст.
+
{{ (region.current.pressure / 1.333).toFixed(0) }}
+
+
+
Влажность, %
+
{{ region.current.humidity }}
+
+
+
Облачность, %
+
{{ region.current.clouds }}
+
+
+
Ветер, м/с
+
{{ region.current.wind_speed }}
+
+
+
+
+
+