vuejs crud

 


install bootstarap vue

fontawesome 

intergrate

table list with pagination


in vue

option api

convert option api to composition api

in web.php


Route::get('/{any}', function () {
return view('vue');
})->where('any', '.*');

when we visit any url in web it redirect to vue


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue App</title>
</head>
<body>
<div id="app"></div>
<script src="{{ mix('js/main.js') }}"></script>
</body>
</html>


npm i bootstrap-vue-3

vue create. => to install vue 

table with pagination with simple data

basic vue page

pareent.vue

<template>
<div>
<h1>Parent Component</h1>
<Child :user="userInfo" @onUpdated="handleUpdate" />
</div>
</template>

<script>
import Child from './Child.vue';

export default {
components: {
Child
},
data() {
return {
userInfo: { name: 'Alice', age: 30 }
};
},
computed: {
userAge() {
return this.userInfo.age;
}
},
watch: {
userAge(newVal, oldVal) {
console.log(`User age changed from ${oldVal} to ${newVal}`);
}
},
methods: {
handleUpdate(newData) {
console.log("Updated data received from child:", newData);
this.userInfo = newData; // This will trigger the watcher.
}
},
beforeCreate() {
console.log('Parent is about to be created');
},
created() {
console.log('Parent has been created');
},
beforeMount() {
console.log('Parent is about to be mounted');
},
mounted() {
console.log('Parent component is mounted');
},
beforeUnmount() {
console.log('Parent component is about to be unmounted');
},
unmounted() {
console.log('Parent component has been unmounted');
}
};
</script>

child.vue

<template>
<div>
<h2>Child Component</h2>
<p>User Name: {{ user.name }}, Age: {{ user.age }}</p>
<button @click="updateUser">Age User</button>
</div>
</template>

<script>
export default {
props: {
user: {
type: Object,
required: true
}
},
emits: ['onUpdated'],
methods: {
updateUser() {
const updatedUser = { ...this.user, age: this.user.age + 1 };
this.$emit('onUpdated', updatedUser);
}
},
beforeCreate() {
console.log('Child is about to be created');
},
created() {
console.log('Child has been created');
},
beforeMount() {
console.log('Child is about to be mounted');
},
mounted() {
console.log('Child component is mounted');
},
beforeUpdate() {
console.log('Child component is about to update');
},
updated() {
console.log('Child component has updated');
},
beforeUnmount() {
console.log('Child component is about to be unmounted');
},
unmounted() {
console.log('Child component has been unmounted');
}
};
</script>

named slot and scoped slot

parent.vue

<template>
<div>
<h1>Parent Component</h1>
<Child :user="userInfo" @onUpdated="handleUpdate">
<!-- Using a named slot -->
<template #footer>
<p>This is the footer in the parent component.</p>
</template>
</Child>
</div>
</template>

<script>
import Child from './Child.vue';

export default {
components: {
Child
},
data() {
return {
userInfo: { name: 'Alice', age: 30 }
};
},
methods: {
handleUpdate(newData) {
console.log("Updated data received from child:", newData);
this.userInfo = newData;
}
}
};
</script>

child.vue

<template>
<div>
<h2>Child Component</h2>
<p>User Name: {{ user.name }}, Age: {{ user.age }}</p>
<!-- Using a scoped slot -->
<slot :user="user" :updateUser="updateUser" />
<!-- Using a named slot -->
<slot name="footer" />
<button @click="updateUser">Age User</button>
</div>
</template>

<script>
export default {
props: {
user: {
type: Object,
required: true
}
},
emits: ['onUpdated'],
methods: {
updateUser() {
const updatedUser = { ...this.user, age: this.user.age + 1 };
this.$emit('onUpdated', updatedUser);
}
}
};
</script>

  • The parent component (Parent.vue) includes a named slot with the key footer. Inside this slot, we have a simple paragraph that serves as the footer content.
  • The child component (Child.vue) has a scoped slot that receives the user object and the updateUser method from the parent. It also includes the named slot for the footer content.
  • The Child component still emits an onUpdated event to communicate with the parent when the user data is updated.

This setup demonstrates the use of both scoped and named slots in Vue.js, allowing for more flexible and reusable component compositions. Scoped slots enable passing data and methods from the parent to the child component, while named slots provide a way to define specific areas in the child component's template for content insertion.

===================

compostion api

parent component

<template>
<div>
<h1>Parent Component</h1>
<Child :user="userInfo" @onUpdated="handleUpdate" />
</div>
</template>

<script setup>
import { ref, computed, watch, onBeforeMount, onMounted, onBeforeUnmount, onUnmounted } from 'vue';
import Child from './Child.vue';

const userInfo = ref({ name: 'Alice', age: 30 });

const userAge = computed(() => userInfo.value.age);

const handleUpdate = (newData) => {
console.log("Updated data received from child:", newData);
userInfo.value = newData; // This will trigger the watcher.
};

watch(userAge, (newVal, oldVal) => {
console.log(`User age changed from ${oldVal} to ${newVal}`);
});

onBeforeMount(() => {
console.log('Parent is about to be mounted');
});

onMounted(() => {
console.log('Parent component is mounted');
});

onBeforeUnmount(() => {
console.log('Parent component is about to be unmounted');
});

onUnmounted(() => {
console.log('Parent component has been unmounted');
});
</script>

child component

const updatedUser = { ...user, age: user.age + 1 };

const updatedUser = { ...$props.user, age: $props.user.age + 1 };


<template>
<div>
<h2>Child Component</h2>
<p>User Name: {{ user.name }}, Age: {{ user.age }}</p>
<button @click="updateUser">Age User</button>
</div>
</template>

<script setup>
import { ref, emit, defineProps,onBeforeMount, onMounted, onBeforeUnmount, onUnmounted, onBeforeUpdate, onUpdated } from 'vue';

const user = ref(null);
const { user } = defineProps(["user"]);
const updateUser = () => {
const updatedUser = { ...user.value, age: user.value.age + 1 };
emit('onUpdated', updatedUser);
};

onBeforeMount(() => {
console.log('Child is about to be mounted');
});

onMounted(() => {
console.log('Child component is mounted');
});

onBeforeUnmount(() => {
console.log('Child component is about to be unmounted');
});

onUnmounted(() => {
console.log('Child component has been unmounted');
});

onBeforeUpdate(() => {
console.log('Child component is about to update');
});

onUpdated(() => {
console.log('Child component has updated');
});
</script>


DONT IMPORT BOOTSTRAPVUE3 In individual vue files


npm install vue-feather-icons

node -v
nvm install 19
nvm use 19

npx mix watch

npm ls vue-feather-icons

npm install @fortawesome/fontawesome-free
npm install --save @fortawesome/fontawesome-svg-core @fortawesome
/free-solid-svg-icons @fortawesome/vue-fontawesome
npm i bootstrap-vue-next
bootstrap-vue-next
BAccordion, BAccordionItem, BAlert, BAvatar, BAvatarGroup, BBadge, BBreadcrumb, BBreadcrumbItem, BButton, BButtonGroup, BButtonToolbar, BCard, BCardBody, BCardFooter, BCardGroup, BCardHeader, BCardImg, BCardSubtitle, BCardText, BCardTitle, BCarousel, BCarouselSlide, BCloseButton, BCol, BCollapse, BContainer, BDropdown, BDropdownDivider, BDropdownForm, BDropdownGroup, BDropdownHeader, BDropdownItem, BDropdownItemButton, BDropdownText, BForm, BFormCheckbox, BFormCheckboxGroup, BFormFile, BFormFloatingLabel, BFormGroup, BFormInput, BFormInvalidFeedback, BFormRadio, BFormRadioGroup, BFormRow, BFormSelect, BFormSelectOption, BFormSelectOptionGroup, BFormSpinbutton, BFormTag, BFormTags, BFormText, BFormTextarea, BFormValidFeedback, BImg, BInputGroup, BInputGroupAddon, BInputGroupAppend, BInputGroupPrepend, BInputGroupText, BLink, BListGroup, BListGroupItem, BModal, BModalOrchestrator, BNav, BNavForm, BNavItem, BNavItemDropdown, BNavText, BNavbar, BNavbarBrand, BNavbarNav, BNavbarToggle, BOffcanvas, BOverlay, BPagination, BPlaceholder, BPlaceholderButton, BPlaceholderCard, BPlaceholderTable, BPlaceholderWrapper, BPopover, BProgress, BProgressBar, BRow, BSpinner, BTab, BTable, BTableLite, BTableSimple, BTabs, BTbody, BTd, BTfoot, BTh, BThead, BToast, BToastOrchestrator, BTooltip, BTr, BTransition, BvCarouselEvent, BvEvent, BvTriggerableEvent, Components, Composables, Directives, Types, Utils, createBootstrap, default, useBreadcrumb, useColorMode, useModal, useModalController, useScrollspy, useToast, vBColorMode, vBModal, vBPopover, vBScrollspy, vBToggle, vBTooltip

mport { BootstrapVue3, BModal, BButton } from 'bootstrap-vue-3';

app.use(BootstrapVue3);
app.component('b-modal', BModal);
app.component('b-button', BButton);
BAccordion, BAccordionItem, BAlert, BAvatar, BAvatarGroup, BBadge, BBreadcrumb, BBreadcrumbItem, BButton, BButtonGroup, BButtonToolbar, BCard, BCardBody, BCardFooter, BCardGroup, BCardHeader, BCardImg, BCardSubtitle, BCardText, BCardTitle, BCarousel, BCarouselSlide, BCloseButton, BCol, BCollapse, BContainer, BDropdown, BDropdownDivider, BDropdownForm, BDropdownGroup, BDropdownHeader, BDropdownItem, BDropdownItemButton, BDropdownText, BForm, BFormCheckbox, BFormCheckboxGroup, BFormFloatingLabel, BFormGroup, BFormInput, BFormInvalidFeedback, BFormRadio, BFormRadioGroup, BFormRow, BFormSelect, BFormSelectOption, BFormSelectOptionGroup, BFormSpinButton, BFormTag, BFormTags, BFormText, BFormTextarea, BFormValidFeedback, BImg, BInputGroup, BInputGroupAddon, BInputGroupAppend, BInputGroupPrepend, BInputGroupText, BLink, BListGroup, BListGroupItem, BModal, BNav, BNavForm, BNavItem, BNavItemDropdown, BNavText, BNavbar, BNavbarBrand, BNavbarNav, BNavbarToggle, BOffcanvas, BOverlay, BPagination, BPlaceholder, BPlaceholderButton, BPlaceholderCard, BPlaceholderTable, BPlaceholderWrapper, BPopover, BProgress, BProgressBar, BRow, BSkeleton, BSkeletonIcon, BSkeletonTable, BSkeletonWrapper, BSpinner, BTab, BTable, BTableSimple, BTabs, BTbody, BTd, BTfoot, BTh, BThead, BToast, BToastContainer, BToastPlugin, BToaster, BTr, BTransition, BootstrapVue3, BvEvent, BvModalEvent, Components, Composables, Directives, Types, Utils, default, useBreadcrumb, useColorMode, useToast, vBColorMode, vBPopover, vBToggle, vBTooltip, vBVisible)


import { createApp } from 'vue';
import App from './App.vue';
import router from './router'; // Import the router instance
import { createBootstrap} from 'bootstrap-vue-next';
import { BootstrapVue3, BModal, BButton} from 'bootstrap-vue-3'; // Import BVModalPlugin
import { BSkeleton, BSkeletonIcon, BSkeletonTable, BSkeletonWrapper, BToastContainer, BToastPlugin, BToaster, BvEvent, BvModalEvent, vBColorMode, vBPopover, vBToggle, vBTooltip, vBVisible } from 'bootstrap-vue-nuxt';

import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
import { library } from '@fortawesome/fontawesome-svg-core';
import { fas } from '@fortawesome/free-solid-svg-icons';

import 'bootstrap/dist/css/bootstrap.css';
import 'bootstrap-vue-next/dist/bootstrap-vue-next.css';

import "bootstrap-vue-3/dist/bootstrap-vue-3.css";
const app = createApp(App); // Create the Vue app instance

// Use BootstrapVue and IconsPlugin
app.use(createBootstrap);
app.use(BootstrapVue3);
app.component('b-modal', BModal);
app.component('b-button', BButton);
// Add Font Awesome icons to the library
library.add(fas);

// Register Font Awesome icon component globally
app.component('font-awesome-icon', FontAwesomeIcon);

=

npm install vuex@next --save



No comments:

Post a Comment

Event listening in react

 How we can listen to som eevents some envents fire like click or automatically user enters into input button , that is event on word type i...