npm create vue@latest
Finns även Vue CLI som använder Web pack, men vi kör Create Vue
Syntax highlightning m.m
Det fundamentala konceptet kring komponenter och props är samma som i React.
<template>
<child-component :some-prop="value" />
</template>
Vidare tillämpar Vue:
<template>
<div class="greeting">
<h1>Welcome, {{ name }}!</h1>
<p>Message to you ...</p>
</div>
</template>
<script>
export default {
name: 'Greeting',
props: {
name: {
type: String,
required: true
}
}
}
</script>
<style scoped>
.greeting h1 {
color: #42b983;
font-family: Verdana, sans-serif;
}
.greeting p {
color: #333;
font-size: 1em;
}
</style>
<template>
<div id="app">
<Greeting :name="userName" />
</div>
</template>
<script>
import Greeting from './components/Greeting.vue'
export default {
name: 'App',
components: {
Greeting
},
data() {
return {
userName: 'Sandra'
}
}
}
</script>
Hur händelser kommunicerar uppåt 👍
Motsvarande koncept i React är att skicka callbackfunktioner men när man i Vue använder $emit så triggar man en händelse som fortplantar till dess parent.
<template>
<button @click="emitEvent">Click me</button>
</template>
<script>
export default {
methods: {
emitEvent() {
this.$emit('custom-event', payload);
}
}
};
</script>
ChildComponent.vue
<template>
<Child @custom-event="handleCustomEvent" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
methods: {
handleCustomEvent(data) {
console.log('Event received:', payload);
}
}
};
</script>
ParentComponent.vue
<template>
<ChildComponent>
<p>Content to childcomponent</p>
</ChildComponent>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent,
},
};
</script>
ParentComponent.vue
<template>
<div>
<slot></slot>
</div>
</template>
<script>
export default {
name: 'ChildComponent',
};
</script>
ChildComponent.vue
Liknar children i React
<template>
<ChildComponent>
<template v-slot:header>
<h1>This is the header content.</h1>
</template>
<template v-slot:main>
<p>This is the main content.</p>
</template>
<template v-slot:footer>
<p>This is the footer content.</p>
</template>
</ChildComponent>
</template>
<script>
import BaseLayout from './BaseLayout.vue';
export default {
components: {
BaseLayout,
},
};
</script>
Parent.vue
<template>
<div class="base-layout">
<header>
<slot name="header">Default Header Content</slot>
</header>
<main>
<slot>Default Main Content</slot>
</main>
<footer>
<slot name="footer">Default Footer Content</slot>
</footer>
</div>
</template>
<script>
export default {
name: 'BaseLayout',
};
</script>
BaseLayout.vue
Flera slots kan användas om man använder named slots. Shorthand v-slot är #.
<template>
<div>
<h1>{{ title }}</h1>
<p>{{ message }}</p>
</div>
</template>
<script lang="ts">
import { defineComponent, PropType } from 'vue';
export default defineComponent({
name: 'ExampleComponent',
props: {
title: {
type: String as PropType<string>,
required: true,
},
message: {
type: String as PropType<string>,
default: 'Default message',
},
},
});
</script>
Förutsatt att du valt Typescrpt i din create vue setup. Här kan du även använda dig av type eller interface.
I så fall "type : Object as PropType<CustomType>"