Vue Masterclass | Discount Coupon for Udemy Course
Learn VueJS and build a complete project using Vue, Pinia, TypeScript, TailwindCSS, and more. Covers Vue 2 and 3. | Discount Coupon for Udemy Course
- 97.5 hours hours of on-demand video
- 92 article
- Full lifetime access
- Access on mobile and TV
- Certificate of completion
- 130 additional resources
- Build a complete, real-world Vue application using Vue, Pinia, Vue Router, and more
- Master modern front end technologies like TailwindCSS, TypeScript, and Prettier
- Use Vitest and Vue Testing Libary to write unit tests for all elements of the Vue ecosystem
- Learn best practices for Vue component design
- Covers both Vue 2's Options API and Vue 3's Composition API
Welcome to the most comprehensive Vue course on Udemy!The Vue Masterclass introduces you to the powerful VueJS library for building dynamic, reactive front end interfaces. VueJS has taken the web development community by storm and is a fantastic technology to learn in 2023:Vue has been used to built over 1,000,000 websitesVue has over 200,000 stars on GitHubVue downloads on NPM have doubled year-over-yearVue is used by leading tech companies like Netflix, Apple, GitLab, and Nintendo.The best way to learn a technology is to create something with it. That's why the Vue Masterclass consists of a complete real-world project that we'll build together from scratch. I'll be coding alongside you from the very first line of code.I believe this course is the closest I've come to capturing what it feels like to be a Vue developer on the job. We'll introduce and complete user stories, discuss tradeoffs of different technical approaches, summarize what we've learned at the end of each section, and more.No prior experience with Vue (or any other front end library) is needed. Beginners are welcome! The course starts with Vue basics and progresses to advanced Vue concepts including:Creating Vue componentsStyling Vue componentsUsing Vue directives to compose dynamic interfacesPassing props between componentsEmitting eventsRouting our user from page to pageTesting Vue componentsand more!Throughout 50+ hours of video content, we'll cover numerous aspects of the Vue ecosystem including:Vue (including both the Options API from Vue 2 and the new Composition API in Vue 3)Pinia for global state managementVue Router for navigating the user across pages in our applicationTesting with Vue Testing Library and VitestScaffolding Vue applications with Create VueStyling components with Tailwind CSSAdding type checking with TypeScriptLinting our code with ESLintFormatting our code with Prettierand more!Another aspect that makes the course special is its emphasis on testing. We'll discuss how to unit test our Vue applications using the Vitest and Vue Testing Library packages. We'll also walk through various testing methodologies, including test-driven development (TDD).Vue Masterclass offers you an incredible, comprehensive introduction to the powerful Vue library. I'm super excited to build this project together with you and I can't wait to see you in the course!Who this course is for:Frontend developers eager to learn a modern library for building reactive interfacesReact/Angular developers curious to try an alternative view libraryStudents who learn best by doing rather than watching
Course Content:
Sections are minimized for better readability, click the section title to view the course content
- Course Overview08:52
Welcome to Vue Masterclass! In this lesson, we introduce the Vue.js library and the problems it helps us to solve. We also walk through the technical prerequisites (HTML, CSS, JavaScript, Terminal), the concepts we'll learn throughout the lessons, and the benefits of taking the course.
- Introducing our Project (Careers Site)06:49
In this course, we'll be building out a job search app strongly inspired by the Google Careers website. This is a real-world Vue project that Google developers had to build. We'll discover that there's a lot of hidden complexity hiding in this application; it offers us a perfect opportunity to learn all about Vue.
- BONUS: Vue 2 vs. Vue 304:48
In this lesson, we'll explain the differences between versions 2 and 3 of Vue. Version 3 introduces the Composition API, a new way to build components. The Composition API is complementary to the existing Options API that Vue 2 uses. We will be learning both APIs throughout the course.
- BONUS: Vue vs. React vs. Angular09:07
In this lesson, we'll learn the differences between the Vue, React, and Angular front-end libraries/frameworks. Vue exists midway between the unopinionated React library and the opinionated Angular framework. Vue only cares about the view layer but its core team develops supplemental libraries to assist with other problems in front-end development.
- Technical Requirements00:37
In this lesson, you'll discover through the technical tools you'll need to install to proceed through the course.
- Install Google Chrome01:07
In this lesson, we download the Google Chrome web browser that we'll be using to view our Vue application
- Install Git00:58
In this lesson, we download Git for source control. You can use Git to make commits during your project development. I recommended adding a commit at the end of every lesson.
- Node Setup for macOS Users00:34
If you're a macOS user, you'll need to install some Xcode development tools before you can install Node on your computer. This lesson shows you how to install these software prerequisites.
- Install Node01:27
In this lesson, we'll walk through the installation of the Node runtime environment for your computer. Node and NPM are required to work with VueJS.
- Install VSCode00:51
In this lesson, we'll setup the free VSCode (Visual Studio Code) text editor. We'll be using it to write our code throughout the course.
- Install VSCode Extensions01:06
In this lesson, we install 3 helpful extensions for working with our project: Vetur, ESLint, and Prettier.
- Asking Good Questions01:03
In this lesson, we deliver some insights for how to ask good questions in the Q&A section.
- Use Create Vue to Initialize Vue Project07:15
In this lesson, we use the Create Vue NPM utility to scaffold a Vue 3 application powered by Vite. We configure the app to include Vitest, ESLint, and Prettier. Finally, we learn how to start the development server and load the Vue app in our browser.
- Configuring the App: VSCode05:12
In this lesson, we configure the settings.json file in VSCode that holds our project settings. The complete file is available in the previous lesson. Double-check that its content matches your file's content.
- Configuring the App: ESLint03:59
In this lesson, we upgrade our project's ESLint configuration file to enable the stricter recommended settings.
- Hot Reloading03:32
In this lesson, we make changes in our code editor to observe hot reloading, a feature in which Vite detects our file changes and updates the browser content immediately.
- Project Structure14:16
In this lesson, we review the files, folders, and project structure generated by Create Vue CLI.
- Mounting the Vue App07:12
In this lesson, we discuss how to bootstrap the Vue application in the main.js file. The app identifies an HTML element on the page to "hook into" and launch itself from.
- The @ Symbol for src Directory02:10
In this lesson, we learn about the @ shortcut for the src directory in our project. We also practice using it in main.js.
- The Parts of a Vue File07:43
In this lesson, we introduce the 3 sections of a Vue component file:the template section for HTML, the script section for JavaScript, and the style section for CSS.
- Cleanup, Cleanup04:05
In this lesson, we delete several starter files that Create Vue generated in order to prep for the next section of the course.
- More on Components06:29
In this lesson, we render multiple instances of the same HelloWorld component to understand the benefits of component reusability in Vue.
- Install Dev Tools06:31
In this lesson, we install the Vue Dev Tools, a Chrome extension for debugging Vue applications. We then test out the extension with our job search application.
- Section Review [SLIDES]06:07
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 200:21
Download the project code as it stands at the end of section 2. This can be helpful if you'd like to pick up the course at a specific section.
- Targeting by HTML Element or CSS Class05:09
In this lesson, we discuss how CSS in a component's style section can "leak out" and affect other components.
- The scoped Attribute04:09
In this lesson, we limit the scope of a component's styles to its own <template> elements by adding the scoped attribute in the <style> tag.
- A Little Housekeeping02:04
In this lesson, we clean up our job search codebase and delete some files in preparation for next course section.
- Section Review [SLIDES]01:13
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 300:21
Download the project code as it stands at the end of section 3. This can be helpful if you'd like to pick up the course at a specific section.
- Introduction to Tailwind CSS05:54
Learn about the Tailwind CSS library which includes thousands of CSS utility classes. Each class adds a single CSS attribute/property declaration. We combine multiple classes together to form the complete user interface.
- Add Tailwind CSS to Project08:16
In this lesson, we add TailwindCSS to our Vite/Vue project. We configure the tailwind.config.js file and configure our index.css file to incorporate Tailwind directives.
- BONUS: ES6 Spread Syntax for Arrays06:25
Review the ES6 spread syntax for arrays, which copies all elements from an original array into a new one.
- Add Open Sans Font to Project08:42
In this lesson, we add the Open Sans font to our project from Google Fonts. We also configure Tailwind to preserve its default styles in case our new font fails to load.
- Try Out Tailwind Styles in App.vue03:42
In this lesson, we practice using Tailwind in a Vue component by applying styles for margin, font size, and text alignment.
- Install Tailwind CSS IntelliSense Extension03:29
In this lesson, we install a helpful VSCode extension to enable Tailwind CSS Intellisense, which shows helpful pop-up suggestions as we type our classes.
- Install Prettier Plugin for Tailwind03:40
In this lesson, we install a Prettier plugin to sort our Tailwind classes in a consistent order.
- Section Review [SLIDES]02:50
Review everything we learned in this section about TailwindCSS, utility classes, setup and more.
- Code at End of Section 400:21
Download the project code as it stands at the end of section 4. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:04
In this lesson, we'll introduce our next user story. We'll be building a main nav to enable the user to navigate between the pages of our site.
- Creating the MainNav Component06:02
In this lesson, we create a new MainNav component in a new vue file.
- Rendering Child Component with the components Property06:13
In this lesson, we render our MainNav as a child component within our App component. We also discuss the components property of the configuration object, where we register imported components so we can use them in the <template> section.
- Different Ways to Render a Component05:11
In this lesson, we discuss the different syntactical options to render a child component including <kebab-case> and <PascalCase>. We also introduce self-closing component tags versus opening + closing component tags.
- Update Tailwind Styles06:49
In this lesson, we update tailwind.config.js to add 3 custom colors to our app. Tailwind will auto-generate CSS classes (for things like font and background) using our new colors.
- CSS: Styling the MainNav Component09:03
In this lesson, we style our MainNav component using TailwindCSS.
- BONUS: JavaScript Objects, Properties, and Methods12:12
In this lesson, we review the basics of JavaScript objects including properties, methods, and the this keyword, which allows us to reference the current object.
- Rendering Data to View I07:00
In this lesson, we introduce component data. Data is state that changes over time. We can use our data in our <template> with the use of double curly braces {{ and }}.
- Rendering Data to View II: Multiple Data Properties05:55
In this lesson, we practice the interpolation syntax (curly braces) that we introduced in the previous lesson and add more properties to our MainNav component's data.
- Section Review [SLIDES]02:36
In this lesson, we review the concepts we covered in the previous section of the course including component data, Tailwind custom colors, and more.
- Code at End of Section 500:21
Download the project code as it stands at the end of section 5. This can be helpful if you'd like to pick up the course at a specific section.
- Intro to Testing16:05
In this lesson, we introduce the benefits of testing and the libraries we'll be using: Vitest and Vue Testing Library.
- Quick Fix for Testing Issues00:21
In this lesson, we'll fix a quick issue due to differences in the latest version of Create Vue.
- The Basics of Vitest Syntax11:10
In this lesson, we create our first Vitest file and write a basic test using the describe, it, and expect functions.
- Multiple Describe Blocks09:32
In this lesson, we practice declaring multiple describe blocks in a Vitest test file.
- Intro to Test-Driven Development (TDD)12:05
In this lesson, we introduce test-driven development (TDD) and the benefits it gives us. TDD means we write our tests first, before the implementation code.
- Test-Driven Development In Action08:00
In this lesson, we demonstrate TDD with a simple mathematical example.
- Adding the —coverage Flag08:01
In this lesson, we add the --coverage flag to our test:unit command to ask Vitest to run a code coverage check when it runs our tests.
- Setup Vitest Globals05:43
In this lesson, we enable our Vitest functions (like describe and it) to be available automatically in our test files.
- Quick Cleanup00:53
In this lesson, we delete our sample playground.test.js file, as it was just for example.
- Section Review [SLIDES]05:27
Review everything we learned in this course section including Vitest syntax, test-driven development, configuring Vitest global functions, and more.
- Code at End of Section 600:21
Download the project code as it stands at the end of section 6. This can be helpful if you'd like to pick up the course at a specific section.
- Cleaning up App.vue01:11
In this lesson, we clean up the App.vue component to prepare for the tests we'll be writing in the upcoming lessons.
- Setup Vue Testing Library10:37
In this lesson, we install the Vue Testing Library and some complementary libraries. We also create a setup file that adds new matchers to our Vitest assertions.
- The render Function and screen Object07:30
In this lesson, we use the render function to render our Vue component to a virtual DOM. We also introduce the screen object and the debug method to show the HTML markup.
- Our First Component Assertion07:29
In this lesson, we use the toBeInTheDocument assertion to validate the presence of a piece of text in our MainNav component tests.
- The Second Argument to render Function06:21
In this lesson, we introduce the second argument to the render function and discuss the tradeoffs of customizing the component's data in our test suite.
- Section Review [SLIDES]04:51
Review everything we learned in this section of the course including installing and setting up Vue Testing Library, rendering a component, and checking for the presence of text with the toBeInTheDocument matcher.
- Code at End of Section 700:21
Download the project code as it stands at the end of section 7. This can be helpful if you'd like to pick up the course at a specific section.
- The v-bind Directive I05:57
In this lesson, we introduce our first Vue directive, v-bind. The v-bind directive allows us to connect a piece of component data to an HTML element attribute.
- The v-bind Directive II: Shortcut02:33
In this lesson, we introduce the : shortcut syntax for the v-bind directive.
- CSS: Styling Navigation Items04:56
In this lesson, we style the navigation menu in our MainNav component using TailwindCSS.
- The v-for Directive08:46
In this lesson, we introduce the v-for directive, which repeats a chunk of HTML for every element in an iterable (such as an array).
- The :key Attribute07:06
In this lesson, we discuss the importance of adding a key attribute to our v-for iterations. Each value of the key attribute must be unique.
- Using Tailwind's First Child Utility Class03:59
In this lesson, we introduce the first prefix in Tailwind to apply styles to only the first child in a collection.
- Review: The ES6 map Method on an Array08:01
In this lesson, we review the ES6 map method on array. The map method returns a new array by performing a consistent operation on each element from the original array.
- ARIA Roles [SLIDES]10:28
In this lesson, we introduce accessibility and the concept of ARIA roles, which are "responsibility labels" that the browser assigns to our elements.
- Testing the v-for Directive09:05
In this lesson, we write a test for the menu items in our MainNav component and introduce the getAllByRole method.
- Install Testing Playground Extension04:31
In this lesson, we install the Testing Playground browser extension, which helps generate and recommend queries for our component tests.
- Section Review [SLIDES]05:50
In this lesson, we review everything we learned in this section including the v-bind and v-for directives, the Testing Playground extension, ARIA roles + accessibility, and more.
- Code at End of Section 800:21
Download the project code as it stands at the end of section 8. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:11
In this lesson, we introduce our next user story: simulating a user logging into our job search app.
- Create ActionButton Component04:37
In this lesson, we create a new ActionButton component and render it within MainNav.
- CSS: Styling ActionButton02:20
In this lesson, we add initial styles to our ActionButton component.
- Add Custom Box Shadow to ActionButton03:30
In this lesson, we modify our tailwind.config.js file to generate new CSS classes for a custom box shadow.
- Create ProfileImage Component06:33
In this lesson, we create a new ProfileImage Vue component to store our user profile picture.
- Conditional Rendering with the v-if Directive06:05
In this lesson, we introduce the v-if directive to conditionally render a chunk of HTML within our component template.
- The v-else Directive05:57
In this lesson, we introduce the complementary v-else directive, which renders a chunk of HTML when the v-if directive evaluates to false.
- Adding Methods to Vue Component02:22
In this lesson, we learn how to add methods to our Vue component by using the configuration object in the Options API.
- The v-on Directive I: HTML Element03:58
In this lesson, we introduce the v-on directive, which allows us to react to an event like a user click or user type.
- The v-on Directive II: Shortcut02:14
In this lesson, we show the @ shortcut for the v-on directive. This is the preference of our ESLint configuration.
- The Event Object04:16
In this lesson, we discuss the Event object that the browser generates for us when an event occurs. The object contains metadata about the event that transpired.
- Overwriting Component Data in a Method06:27
In this lesson, we learn how to use the this keyword to access and overwrite component data within a method.
- The queryBy Methods from Vue Testing Library13:05
In this lesson, we learn about the queryBy family of methods in Vue Testing Library, which return null when they are unable to find the given query.
- The userEvent Library09:48
In this lesson, we introduce the @testing-library/user-event library, which we use to simulate user interactions with our components.
- Section Review [SLIDES]09:45
In this lesson, review everything we learned in this course section including the v-if and v-else directives, querying with the queryBy family of method, using userEvent to interact with components in tests, and more!
- Code at End of Section 900:21
Download the project code as it stands at the end of section 9. This can be helpful if you'd like to pick up the course at a specific section.
- User Story: Multiple Buttons03:39
Welcome to the next section of the course! In this lesson, we introduce our next user story: multiple buttons to communicate primary and secondary actions on our view.
- Independent Components02:54
- Intro to Props07:52
- The Tailwind @apply Directive05:39
- Adding v-bind to class Attribute05:02
- Adding Slice of Data for Dynamic Class03:36
- Intro to Computed Properties11:13
- Computed Properties for Class Object05:38
- Adding New Blue Color to Tailwind Config01:19
- Adding Secondary Button Style05:01
- Passing in Props for Style09:47
- Adding a type Prop06:12
- BONUS: ES6 Review: Dynamic Object Keys04:09
- Refactoring the type Prop03:22
- Testing CSS Classes10:51
- Updating Prop Validation in ActionButton08:05
- Custom Prop Validation with the validator Function06:33
- Section Review [SLIDES]07:34
- Code at End of Section 1000:21
Download the project code as it stands at the end of section 10. This can be helpful if you'd like to pick up the course at a specific section.
- User Story: Subnav02:52
- Create TheSubnav Component03:34
- Styling TheSubnav Component02:00
- Install FontAwesome03:27
- Register Global Components06:45
- Use FontAwesome Icon in TheSubnav05:01
- Conditionally Render TheSubnav01:57
- Using TDD for v-if Directive for Jobs Page11:32
- Fixing Test Warnings in TheSubnav and MainNav08:17
- Using Helper Function in MainNav Test03:30
- Section Review [SLIDES]03:19
- Code at End of Section 1100:21
Download the project code as it stands at the end of section 11. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:10
- Create TheHero.vue Component05:23
- Dynamically Adjust Height of Header10:41
- CSS: Style TheHero Component02:27
- Introducing CSS Grid03:40
- Apply CSS Grid to TheHero04:42
- Introduction to Vue Lifecycle Hooks - Lifecycle Methods06:36
- REVIEW: The setTimeout, setInterval and clearInterval Functions11:48
- Using the created Lifecycle Hook04:05
- Changing the Action Verb in TheHeadline13:04
- CSS: Style Action Verb06:08
- CSS: Fix Styles of Primary Header02:04
- CSS: Fix Styles of Secondary Header00:43
- Refactor Font Color Class Selection02:28
- Microphone Update00:15
- Moving Interval Function Logic Out of Component11:57
- Adding Function to Headline Component01:42
- Intro to vi.fn() Function08:00
- Tests for TheHeadline Component10:10
- More Tests for TheHeadline Component07:39
- Even More Tests for TheHeadline Component04:01
- The beforeEach and afterEach Functions04:03
- Section Review [SLIDES]11:18
- Code at End of Section 1200:21
Download the project code as it stands at the end of section 12. This can be helpful if you'd like to pick up the course at a specific section.
- User Story01:30
- Add New Colors to tailwind.config.js01:06
- Create JobSearchForm Component04:02
- Add Bottom Margin to TheHeadline00:53
- CSS: Styling JobSearchForm I03:50
- CSS: Styling JobSearchForm II11:05
- Binding Component Data to Form Input06:29
- Binding Form Input to Component Data08:47
- Two-Way Data Binding with v-model Directive04:35
- Image Link for Next Lesson00:09
- Add Vue Image in Grid02:49
- Refactor I: Isolating Navigation Components04:20
- Refactor II: Isolating JobSearch Components03:20
- Refactor III: Isolating Shared Components02:13
- Section Review [SLIDES]03:21
- Code at End of Section 1300:21
Download the project code as it stands at the end of section 13. This can be helpful if you'd like to pick up the course at a specific section.
- Creating Reusable TextInput Component05:09
- Using TextInput in JobSearchForm05:12
- Emitting an Event from a Component05:49
- Listing to Emitted Messages04:45
- Overwriting Parent Data from Emits03:33
- Inline Overwriting03:59
- Improving Our Design09:56
- The v-model Directive on Component03:56
- The emits Key03:22
- Testing Event Emission11:33
- Section Review [SLIDES]07:13
- Code at End of Section 1400:21
Download the project code as it stands at the end of section 14. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:06
- Install Vue Router02:23
- Writing the Router File11:59
- The router-view Component04:31
- The router-link Component05:56
- Keep MainNav Constant, Dynamically Render Component02:19
- Adding Content to Home Page01:17
- Accessing this.$route03:58
- Accessing this.$router02:45
- Navigating with router.push Method03:28
- Adding a <router-link> Item to MainNav05:01
- Fixing Warnings with the RouterLinkStub Component05:25
- Section Review06:05
- Code at End of Section 1500:21
Download the project code as it stands at the end of section 15. This can be helpful if you'd like to pick up the course at a specific section.
- User Story01:11
- Adding <router-link> to Main Menu05:14
- The mocks Property for render Function Config13:05
- Fixing MainNav Tests03:03
- Using Factory Functions for TheSubnav Tests05:10
- Creating Page for Individual Job06:57
- Display the Route ID Dynamically03:56
- BONUS: Review: Query Params04:51
- Navigating to Job Results Page when Submitting Form08:17
- Testing JobSearchForm Form Submission19:03
- Section Review [SLIDES]05:19
- Code at End of Section 1600:21
Download the project code as it stands at the end of section 16. This can be helpful if you'd like to pick up the course at a specific section.
- User Story00:57
- Create JobFiltersSidebar Component03:34
- Create JobListings Component02:00
- CSS: Styling JobFiltersSidebar and JobListings Components03:13
- Extend Tailwind with New Boxshadow Option01:19
- CSS: Adding Job Title and Location to a Job Listing06:37
- CSS: Adding Job Qualifications to Job Listing04:38
- Extracting JobListing to Separate Component03:00
- Section Review [SLIDES]02:13
- Code at End of Section 1700:21
Download the project code as it stands at the end of section 17. This can be helpful if you'd like to pick up the course at a specific section.
- Install JSON Server03:12
- Create Our Jobs Data06:01
- Making Jobs Request in Browser03:11
- Install Axios NPM Package05:41
- Making Axios Request for Jobs in JobListings Component05:58
- REVIEW: async/await Syntax07:07
- Use async/await Syntax to Fetch Jobs01:36
- Render JobListing in JobResults04:35
- Compute Dynamic Job Page04:13
- Update Job Listing to Render Job’s Data05:40
- Testing the JobListing Component07:11
- Refactoring JobListings Test09:33
- More Tests for JobListing Component05:22
- Mocking a Module with Vitest08:26
- Create First Tests for JobListings Component15:50
- Section Review [SLIDES]07:50
- Code at End of Section 1800:24
Download the project code as it stands at the end of section 18. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:11
- REVIEW: The slice Method05:18
- Display only the First 10 Jobs06:09
- Dynamic Pagination09:34
- Fixing Failing JobListings Component Tests04:46
- Refactor JobListings Component Tests05:06
- Displaying Page Number at Bottom of Job Listings04:45
- Wiring Up Computed Properties for Next and Previous Page04:48
- Rendering the Previous and Next Page06:56
- Scrolling to Top on Params Change03:48
- Adding Tests for Page Number05:06
- More Tests for JobListings Component08:48
- Fixing the Bug09:52
- Adding More Tests for JobListings Component05:00
- Environment Variables in Vite20:11
- Section Review [SLIDES]06:40
- Code at End of Section 1900:24
Download the project code as it stands at the end of section 19. This can be helpful if you'd like to pick up the course at a specific section.
- What is Pinia?07:58
- Install Pinia Dependency00:39
- Register Pinia Store01:54
- Creating a Pinia Store05:42
- Add First Store Action02:51
- Adding Tests for Pinia State and Actions08:34
- Reading from Pinia Store in Component with mapStores Function08:36
- Writing to Pinia Store in Component02:46
- Interacting with Pinia Store in Dev Tools04:28
- Install Pinia Testing Library02:03
- Fixing our Failing MainNav Tests09:57
- A Second Testing Option08:57
- The mapState and mapActions Functions07:06
- Section Review [SLIDES]08:36
- Code at End of Section 2000:24
Download the project code as it stands at the end of section 20. This can be helpful if you'd like to pick up the course at a specific section.
- Intro to the Section02:01
- Review of vi.mock and Building out API Call03:51
- TDD: Adding Test for Jobs API Call I05:50
- TDD: Adding Test for Jobs API Call II06:24
- TDD: Adding Test for jobs State07:46
- TDD: FETCH_JOBS Action14:04
- Dispatching Action from Component to Fetch Jobs10:15
- Fixing Tests for JobListings Component12:45
- Section Review [SLIDES]03:51
- Code at End of Section 2100:24
Download the project code as it stands at the end of section 21. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:25
- CSS: Adding Initial Styles for JobFiltersSidebar Component05:12
- Update Font Awesome Icons02:03
- Create CollapsibleAccordion Component02:12
- CSS: Styling CollapsibleAccordion Component11:33
- Introduction to Slots07:30
- Render Custom Content in Slot05:27
- Slots and Props04:38
- Writing Test for Slots10:40
- Fallback Content for Slots03:08
- Adding Tests for Fallback Slot Content03:08
- The Usual Refactor04:23
- Extracting Organizations Accordion to New Component04:56
- Section Review [SLIDES]03:47
- Code at End of Section 2200:24
Download the project code as it stands at the end of section 22. This can be helpful if you'd like to pick up the course at a specific section.
- User Story: Building a Reusable Header03:49
- Named Slots I03:39
- Creating TeamsView Page03:41
- Named Slots II04:31
- Default Slot02:11
- Testing Named Slots04:00
- Named Slots Shorthand01:47
- Section Review [SLIDES]02:44
- Code at End of Section 2300:24
Download the project code as it stands at the end of section 23. This can be helpful if you'd like to pick up the course at a specific section.
- User Story04:08
- JSON Content for db.json File00:10
- Adding spotlights Endpoint02:52
- Create SpotLight Component13:00
- Render SpotLight Component12:31
- Alternative Render of Data03:10
- Passing Multiple Props from Scoped Slot02:56
- Object Destructuring with Scoped Slots01:19
- Testing Scoped Slots10:04
- Refactoring Test Suite05:05
- Section Review [SLIDES]04:32
- Code at End of Section 2400:24
Download the project code as it stands at the end of section 24. This can be helpful if you'd like to pick up the course at a specific section.
- User Story00:51
- Review of JavaScript Sets05:27
- Intro to Getters07:59
- Testing Pinia Getters06:19
- Wire Up UNIQUE_ORGANIZATIONS Getter in JobFiltersSidebarOrganizations05:17
- Use v-for to Render Unique Organizations in JobFiltersSidebarOrganizations04:17
- Testing Getters in JobFiltersSidebarOrganizations12:03
- Add v-model to Checkbox for Organizations04:31
- The v-on:change Handler03:41
- TDD: Add selectedOrganizations Property to Pinia Store State02:58
- TDD: Create ADD_SELECTED_ORGANIZATIONS Action04:14
- Dispatch Action to Add Organizations from JobFiltersSidebarOrganizations06:38
- BONUS: REVIEW: filter Method on an Array07:56
- TDD: Adding Getter to Filter Jobs by Organization12:29
- Rendering Filtered Organization Jobs in JobListings Component07:09
- Fixing FILTERED_JOBS_BY_ORGANIZATIONS Getter Bug07:03
- Adding Test for JobFiltersSidebarOrganizations Checkbox Interaction07:11
- Refactoring JobFiltersSidebarOrganizations Test04:30
- Displaying Accurate Number of Filtered Jobs12:49
- Section Review [SLIDES]04:49
- Code at End of Section 2500:24
Download the project code as it stands at the end of section 25. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:28
- TDD: Adding State for Job Types01:56
- TDD: Adding Action for Selecting Job Types02:31
- TDD: Adding Getter for Unique Job Types05:41
- TDD: Adding Getter for Filtered Jobs by Job Types07:14
- TDD: New JobFiltersSidebarJobTypes Component09:32
- Wire up Job Type Filters in Sidebar02:53
- Filter for Job Types in Job Listings04:13
- Allow User to Apply Multiple Filters06:26
- Use New Getter in JobListings Component01:43
- Fixing New Bug07:18
- Getters with Arguments15:42
- Tests for Getters with Arguments07:05
- TDD: Updating TheSubnav Tests and Implementation03:05
- Delete Old Two Getters01:53
- Fixing Extra Bug I12:10
- Fixing Extra Bug II03:54
- Section Review [SLIDES]02:41
- Code at End of Section 2600:24
Download the project code as it stands at the end of section 26. This can be helpful if you'd like to pick up the course at a specific section.
- What is reactivity?07:46
- Vue’s ref Function08:50
- Vue’s computed Function07:32
- One More Example with Another Primitive06:22
- What about Object Reactivity?05:52
- Cleaning up the Code with reactive Function06:37
- Multiple Properties on Reactive Object03:32
- Multiple Levels of Reactivity05:20
- Destructuring Problems02:58
- The toRef Function05:02
- The toRefs Function05:38
- A Clarification on toRefs01:34
- Section Review [SLIDES]06:27
- Code at End of Section 2700:24
Download the project code as it stands at the end of section 27. This can be helpful if you'd like to pick up the course at a specific section.
- Introduction to the Composition API07:58
- The setup Method04:16
- The ref Function in setup Method07:36
- More Practice with ref04:12
- The computed Function03:39
- Accepting Props in Component03:37
- Checking in on Test Suite01:42
- Accepting Props in Setup Method05:34
- Using toRefs on Props04:24
- The new script setup Syntax05:07
- More Practice with the script setup Syntax02:23
- Section Review [SLIDES]06:24
- Code at End of Section 2800:24
Download the project code as it stands at the end of section 28. This can be helpful if you'd like to pick up the course at a specific section.
- Composition API with Vue Router08:55
- Fixing Failing JobSearchForm Tests04:37
- Composition API with Route03:00
- Composition API with Pinia Getters04:27
- Fixing Failing Tests for TheSubnav04:12
- Fixing Failing Tests for MainNav03:13
- Refactoring JobFiltersSidebarJobTypes06:47
- Fixing JobFiltersSidebarJobTypes Tests04:46
- Refactoring JobFiltersSidebarJobOrganizations Component04:34
- Fixing Failing JobFiltersSidebarOrganizations Tests02:52
- Creating Reusable JobFiltersSidebarCheckboxGroup Component10:14
- Reuse JobFiltersSidebarCheckboxGroup10:44
- Adding Tests for JobFiltersSidebarCheckboxGroup13:37
- Section Review [SLIDES]04:13
- Code at End of Section 2900:24
Download the project code as it stands at the end of section 29. This can be helpful if you'd like to pick up the course at a specific section.
- The onMounted Function04:55
- Refactoring JobListings Component to Use Composition API09:56
- Fixing Failing JobListings Tests05:51
- One More Update to JobListings Tests08:12
- Extracting Previous and Next Page Logic to Composable Function08:43
- Add Composables to Component07:39
- Adding Tests for usePreviousAndNextPages Composable06:54
- Updating JobListing Component02:42
- Section Review [SLIDES]03:49
- Code at End of Section 3000:24
Download the project code as it stands at the end of section 30. This can be helpful if you'd like to pick up the course at a specific section.
- Welcome to TypeScript [SLIDES]08:43
- Primitive Types08:16
- Type Inference04:06
- The any type02:40
- The unknown Type and Type Guards08:48
- Array Type Declarations04:45
- Object Type Declarations07:31
- Type Literals04:22
- Type Literals and Objects04:58
- Optional Properties04:43
- Interfaces and Types08:21
- Declaring Types for Functions05:36
- Interfaces for Functions06:00
- Intro to Generics11:45
- Section Review [SLIDES]07:00
- Code at End of Section 3100:24
Download the project code as it stands at the end of section 31. This can be helpful if you'd like to pick up the course at a specific section.
- tsconfig.json for Next Lesson00:24
- Install TypeScript for Vue11:28
- Create Job Interface03:41
- Update getJobs API Call08:47
- Updating Test File for getJobs05:44
- Define Types for User Store03:31
- Define Types for Jobs Store06:58
- Update Jobs Test File to TypeScript I02:35
- Update Jobs Test File to TypeScript II04:48
- TypeScript’s Partial Type04:49
- Create Factory Function for Jobs Test File09:29
- Update Utils Files to TypeScript04:46
- Adding Types to Composables06:00
- Section Review [SLIDES]05:39
- Code at End of Section 3200:24
Download the project code as it stands at the end of section 32. This can be helpful if you'd like to pick up the course at a specific section.
- Adding Type Annotations to ProfileImage Component06:45
- Adding Type Annotations to MainNav Component07:47
- Adding Type Annotations to TheHeadline Component07:30
- Adding Type Annotations to CollapsibleAccordion Component01:21
- Adding Type Annotations to ActionButton Component01:50
- Annotating Event Handlers07:04
- Adding Type Annotations to HeaderContainer Component00:56
- Adding Type Annotations to TheSubnav Component04:09
- Annotating Axios Requests (SpotLight Component)04:49
- Adding Type Annotations to JobListing Component09:04
- Adding Type Annotations to JobListings Component04:30
- Adding Type Annotations to JobFiltersSidebar Component00:58
- Adding Type Annotations to JobFiltersSidebarCheckboxGroup Component06:50
- Adding Type Annotations to JobSearchForm Component01:08
- Adding Type Annotations to TheHero and App Components01:03
- Annotating Our Views02:27
- Updating User Store and Setup Test File02:25
- Section Review [SLIDES]05:23
- Code at End of Section 3300:24
Download the project code as it stands at the end of section 33. This can be helpful if you'd like to pick up the course at a specific section.
- User Story01:23
- JSON Content for db.json File00:12
- Adding /degrees Endpoint to db.json02:48
- TDD for API Call: getDegrees API Call05:15
- An Alternative Syntax for Pinia Stores10:11
- TDD for Action: FETCH_DEGREES09:32
- TDD for Getters: UNIQUE_DEGREES09:16
- TDD for State: selectedDegrees02:26
- TDD for Getters: INCLUDE_JOB_BY_DEGREE06:50
- Updating FILTERED_JOBS Getter01:24
- TDD for Actions: ADD_SELECTED_DEGREES02:58
- Updating JobFiltersSidebar Component05:22
- Fetch Degrees when JobListings Loads05:36
- Trying Out Code in Browser02:15
- Section Review [SLIDES]02:43
- Code at End of Section 3400:24
Download the project code as it stands at the end of section 34. This can be helpful if you'd like to pick up the course at a specific section.
- User Story01:18
- TDD for CLEAR_USER_JOB_FILTER_SELECTIONS Action05:03
- Refactor User Store to new Pinia Syntax07:28
- Wiring up Click Handler In JobFiltersSidebar03:36
- The Pinia $onAction Method08:45
- Refactoring CollapsibleAccordion Component07:00
- Add Tests for Action Side Effect13:26
- Breaking JobFiltersSidebar Into Smaller Components08:45
- Creating JobFiltersSidebarPrompt Component03:25
- Adding Tests for JobFiltersSidebarPrompt Component04:39
- Section Review [SLIDES]02:47
- Code at End of Section 3500:24
Download the project code as it stands at the end of section 35. This can be helpful if you'd like to pick up the course at a specific section.
- User Story03:41
- Create Component to Track Skills and Qualifications03:38
- Add New Search Term to Pinia State01:47
- Add Action to Update Skills Search Term02:51
- Filtering the Jobs by Search Term06:48
- Two More Tests for INCLUDE_JOB_BY_SKILL Getter06:42
- Wiring up Search State to Pinia Store09:51
- The lazy Input Modifier04:48
- The trim Input Modifier02:59
- Adding Tests for JobFiltersSidebarSkills Component13:35
- Clearing the Search Input when Clearing Filters03:10
- Reading Search Term from Params07:06
- Section Review [SLIDES]04:25
- Code at End of Section 3600:24
Download the project code as it stands at the end of section 36. This can be helpful if you'd like to pick up the course at a specific section.
- Congratulations01:17
- Complete Slide Decks00:03
- Intro to V1 of the Course00:58
- Configuring the App: VSCode00:24
This lecture includes some supplementary material for the next video lesson, where we configure the settings.json file that holds our VSCode project settings.
- Configuring the App: Jest00:26
This lesson features the code you'll need to add the jest.config.js file to support test files with a test.js extension. We'll configure this test setting in the next lesson.
- [DEPRECATED - V1] Intro to Vue Complete Section01:19:31
This video includes all videos from the Intro to CSS in Vue section of the course (V1 - Deprecated):
Install Vue CLI
The vue create Command
Starting the Vue App
Hot Reloading
Configuring the App: VSCode
Configuring the App: Jest
Configuring the App: ESLint
Project Structure
Mounting the Vue App
The @ Symbol for Top of Directory
The Parts of a Vue File
More on Components
Install Vue Dev Tools
Section Review
- [DEPRECATED - V1] Intro to CSS in Vue Complete Section15:07
This video includes all videos from the Intro to CSS in Vue section of the course (V1 - Deprecated):
Targeting by HTML Element or CSS Class
The scoped Attribute
A Little Housekeeping
Section Review
- Code at End of Section 300:21
Download the project code as it stands at the end of section 3 [DEPRECATED]. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Intro to Tailwind CSS Complete Section38:14
This video includes all videos from the Intro to Tailwind CSS section of the course (V1 - Deprecated):
Introduction to Tailwind CSS
Add Tailwind CSS to Job Search Project
BONUS: ES6 Array Spreading
Add Open Sans Font from Google Fonts
Try out Tailwind Styles
Install Tailwind CSS Intellisense Extension
Section Review
- Code at End of Section 400:21
Download the project code as it stands at the end of section 4 [DEPRECATED]. This can be helpful if you'd like to pick up the course at a specific section.
- Formatting Issues with Prettier00:26
In this lesson, we modify our .eslintrc.js file to avoid a Prettier issue in the next lesson.
- [DEPRECATED - V1] Rendering Data to View Complete Section01:10:06
This video includes all videos from the Rendering Data to View section of the course (V1 - Deprecated):
User Story
Creating the MainNav Component
Rendering Child Component with the components Property
Different Ways to Render a Vue Component
Update Tailwind Styles
CSS: Styling the MainNav Component
CSS: Styling Our Company Name
BONUS: JavaScript Objects, Properties, and Methods
Rendering Data to View I
Rendering Data to View II
Section Review
- Code at End of Section 500:21
Download the project code as it stands at the end of section 5 [DEPRECATED]. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Intro to Jest01:09:57
This video includes all videos from the Intro to Jest section of the course (V1 - Deprecated):
Why do we test?
The Basics of Jest Syntax
Multiple Describe Blocks
Intro to Test-Driven Development (TDD)
Test-Driven Development in Action
Adding the --watch and --coverage Flags
CSS: Styling Our Company Name
Quick Cleanup
Section Review
- Code at End of Section 600:21
Download the project code as it stands at the end of section 6 [DEPRECATED]. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] First Vue Tests32:52
This video includes all videos from the First Vue Tests section of the course (V1 - Deprecated):
Cleaning up App.vue
Intro to Vue Test Utils
Our First Vue Test
The Second Argument to mount Function
The setData Method
Section Review
- Code at End of Section 700:21
Download the project code as it stands at the end of section 7 [DEPRECATED]. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Directives I01:04:39
This video includes all videos from the Directives I section of the course (V1 - Deprecated):
The v-bind Directive I
The v-bind Directive II: Shortcut
CSS: Styling Navigation Items
The v-for Directive
The :key Attribute
Using Tailwind's First Child Utility Class
BONUS: Review: The map Method on an Array
Testing the v-for Directive
Using data-test to Identify Elements
Section Review
- Code at End of Section 800:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Directives II01:38:22
This video includes all videos from the Directives II section of the course (V1 - Deprecated):
User Story
Create ActionButton Component
CSS: Styling Action Button
Add Custom Box Shadow to ActionButton
Create ProfileImage Component
Conditional Rendering with the v-if Directive
The v-else Directive
Testing the v-else Directive I
Testing the v-else Directive II
Adding Methods to Vue Object
The v-on Directive I: HTML Element
v-on Shortcut
The Event Object
Overwriting Data in a Method
Update Former MainNav Tests
Section Review
- Code at End of Section 900:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Passing Props02:12:14
This video includes all videos from the Passing Props section of the course (V1 - Deprecated):
User Story: Multiple Buttons
Independent Components
Intro to Props
The Tailwind @apply Directive
Fixing CSS Violations
Adding v-bind to Class Attribute
Adding Slice of Data for Dynamic Class
Intro to Computed Properties
Computed Properties for Class Object
Add New Blue Color to Tailwind Config
Adding Secondary Button Style
Passing in Props for Style
Dynamically Using Props
BONUS: ES6 Review: Dynamic Object Properties
Refactoring the type Prop
Testing CSS Classes
Updating PropValidation in ActionButton
Fixing Test Warnings
Custom Prop Validation with the validator Method
Section Review
- Code at End of Section 1000:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Fixing ESLint Violation Issue00:39
In this lesson, we address a compilation error that will arise in the next video due to an ESLint violation. We turn the rule off in our .eslintrc configuration file for ESLint.
- [DEPRECATED - V1] Creating Subnav01:29:38
This video includes all videos from the Creating Subnav section of the course (V1 - Deprecated):
User Story: Subnav
Create Subnav Component
CSS: Styling Subnav Component
Install FontAwesome
Register Global Components
Use FontAwesome Icon in Subnav
Conditionally Render Subnav
Using TDD for v-if Directive for Jobs Page
Updating Subnav Implementation to Pass Tests
Fixing Test Warnings in Subnav
Fixing Test Warnings in MainNav
Adding Tests for ProfileImage
Adding Tests for Subnav in MainNav
Section Review
- Code at End of Section 1100:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Fixing Issue in Next Lesson00:14
In this lesson, we walk through a fix you'll need to apply to the Jest code in the next lesson.
- [DEPRECATED - V1] Creating Headline Component02:35:55
This video includes all videos from the Creating Headline section of the course (V1 - Deprecated):
User Story
Create Hero.vue Component
Dynamically Adjust Height of Header
CSS: Style Hero Component
Introducing CSS Grid
CSS: Apply CSS Grid to Hero
Introduction to Vue Lifecycle Hooks
BONUS: ES6 REVIEW: The setTimeout, setInterval and clearInterval Functions
Using the created Lifecycle Hook
Changing the Action Verb in Headline
CSS: Style Action Verb
CSS: Fix Styles of Primary Header
CSS: Fix Styles of Secondary Header
Refactor Font Color Class Selection
Moving Interval Function Logic Out of Component
Adding Function to Headline Component
Intro to jest.fn() Function
Tests for Headline Component
More Tests for Headline Component
Even More Tests for Headline Component
beforeEach and afterEach
Section Review
- Code at End of Section 1200:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Image Link for Next Lesson00:09
This lesson provides the URL for the image we'll be adding to the app.
- [DEPRECATED - V1] Creating Job Search Form01:15:47
This video includes all videos from the Creating Job Search Form section of the course (V1 - Deprecated):
User Story
Add New Colors to tailwind.config.js
Create JobSearchForm Component
Add Bottom Margin to Headline
CSS: Styling JobSearchForm I
CSS: Styling JobSearchForm II
Binding Component Data to Form Input
Binding Form Input to Component Data
Two-Way Data Binding with v-model Directive
Add Vue Image in Grid
Refactor I: Isolating Navigation Components
Refactor II: Isolating JobSearch Components
Refactor III: Isolating Shared Components
Section Review
- Code at End of Section 1300:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Fixing ESLint Warnings00:33
In this article, we advise how to fix an ESLint warning dealing with hyphenated event names.
- [DEPRECATED - V1] Emitting Events01:23:30
This video includes all videos from the Emitting Events section of the course (V1 - Deprecated):
Creating Reusable TextInput Component
Using TextInput in JobSearchForm
Emitting an Event from a Component
Listing to Emitted Messages
Overwriting Parent Data from Emits
Inline Overwriting
Improving Our Design
Pass in the value prop in JobSearchForm
The v-model Directive on Component
The emits Key
Testing Event Emission
Section Review
- Code at End of Section 1400:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Vue Router I01:38:46
This video includes all videos from the Vue Router I section of the course (V1 - Deprecated):
User Story
Install Vue Router
Vue Router in Action
Rewriting the Router File from Scratch
The <router-view> Component
The <router-link> Component
Keep MainNav Constant, Dynamically Render Component
Adding Content to Home Page
Accessing this.$route
Accessing this.$router
Navigating with router.push
Adding a <router-link> Item to MainNav
Fixing Failing Tests with the RouterLinkStub Component
Refactoring Test Suite: beforeEach()
Refactoring Test Suite with Factory Function
Section Review
- Code at End of Section 1500:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Vue Router II01:41:11
This video includes all videos from the Vue Router II section of the course (V1 - Deprecated):
User Story
Adding <router-link> to Main Menu
The mocks Property for Vue Test Utils Mount Config
Using Factory Functions in Subnav Test
Creating Page for Individual Jobs
Display the Route ID Dynamically
Lazy Loading File Imports
Grouping Lazy Loaded Components in the Same Chunk
BONUS: Review: Query Params
Navigating to Job Results Page when Submitting Form
Testing JobSearchForm Form Submission I
Testing JobSearchForm Form Submission II
Section Review
- Code at End of Section 1600:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Building Job Results37:01
This video includes all videos from the Building Job Results Page section of the course (V1 - Deprecated):
User Story
Create JobFiltersSidebar Component
Create JobListings Component
CSS: Styling JobFiltersSidebar and JobListings Components
Extend Tailwind with New Boxshadow Option
CSS: Adding Job Title and Location to a Job Listing
CSS: Adding Job Qualifications to Job Listing
Extracting JobListing to Separate Component
Render Multiple Job Listings in JobListings.vue
Section Review
- Code at End of Section 1700:21
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Creating Mock Backend02:00:07
This video includes all videos from the Creating Mock Backend section of the course (V1 - Deprecated):
Install JSON Server
Create Our Jobs Data
Making Jobs Request in Browser
Install Axios NPM Package
Making Axios Request for Jobs in JobListings Component
BONUS: ES6 REVIEW: async/await Syntax
Use async/await Syntax to Fetch Jobs
Render JobListing in JobResults
Compute Dynamic Job Page
Update Job Listing to Render Job’s Data
Testing the JobListing Component
Refactoring JobListings Test
More Tests for JobListing Component
Adding Test for Router Link
Mocking a Module with Jest
Create First Tests for JobListings Component
The flushPromises Function
Section Review
- Code at End of Section 1800:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Dynamic Pagination02:08:48
This video includes all videos from the Dynamic Pagination section of the course (V1 - Deprecated):
User Story
BONUS: REVIEW: The slice Method on an Array
Display only the First 10 Jobs
Dynamic Pagination
Fixing Failing JobListings Component Tests
Refactor JobListings Component
Displaying Page Number at Bottom of Job Listings
Wiring Up Computed Properties for Next and Previous Page
Rendering the Previous and Next Page
Scrolling To Top on Params Change
Fixing Router Link Test issue
Adding Tests for Page Number
Fixing Test Pollution
More Tests for Job Listings
Fixing the Bug
Adding More Tests for JobListings Component
Environment Variables
Section Review
- Code at End of Section 1900:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Vuex I: State and Mutations02:04:33
- Code at End of Section 2000:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Vuex II: Actions01:47:26
- Code at End of Section 2100:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- [DEPRECATED - V1] Slots I: Intro to Slots01:13:15
- Code at End of Section 2200:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- User Story: Building a Reusable Header03:49
In this lesson, we introduce our next user story: building a reusable header that can vary the look and feel of its text content (while keeping it centered).
- Named Slots I05:01
In this lesson, we add 2 named slots to our HeaderContainer component. This design allows the parent component to inject content into multiple parts of the HeaderContainer template.
- Creating TeamsPage View05:23
In this lesson, we add a new TeamsView to our app, register it with our routes, and update the MainNav menu to head to the view.
- Named Slots II05:15
In this lesson, we provide content for both slots in our HeaderContainer. We use the design to customize the title and subtitle content. We introduce the new v-slot directive.
- Default Slot02:45
In this lesson, we learn that Vue assigns the name "default" to a slot without a name. We practice using this name fallback in our HeaderContainer component.
- Testing Named Slots05:20
In this lesson, we test the named slots in our HeaderContaiiner component. We demonstrate how we can customize the slot content by altering the config object in our tests.
- Named Slots Shorthand01:45
In this lesson, we learn the hashtag shortcut for rendering a named slot.
- Section Review03:28
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 2300:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- User Story04:08
In this lesson, we introduce our next user story: allowing components to customize how the spotlight content on the front page renders.
- JSON Content for db.json File00:14
Download the new JSON content for the db.json file for JSON Server.
- Adding Spotlights Endpoint02:53
In this lesson, we add a spotlights endpoint to our db.json file that configures the JSON Server.
- Create Spotlights Component13:23
In this lesson, we create a new Spotlight component and use the v-bind syntax to create a spotlight slot prop.
- Render Spotlight Component12:13
In this lesson, we render our Spotlight component in the Hero. We customize the first look and feel of the boxes.
- Alternative Render of Data03:01
In this lesson, we still utilize the Spotlight component but completely change the CSS styles of the rendered content.
- Passing Multiple Props from Scoped Slot04:49
In this lesson, we practice passing multiple slot props up to the parent component from the Spotlight component.
- Object Destructuring with Scoped Slots01:48
In this lesson, we use ES6 object destructuring syntax to access slot props from the Hero parent that renders the Spotlight child component.
- Testing Scoped Slots11:07
In this lesson, we add tests for our new Spotlight component. We mock our our Axios call with jest.mock and use the slots property of the configuration object to render our "parent".
- Refactoring Test Suite05:57
In this lesson, we create a mockSpotlightsResponse helper function to simplify our Spotlight test suite.
- Section Review04:11
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 2400:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- User Story00:53
We're back in Vuex land! In this lesson, we review our user story: letting the user filter jobs by organizations.
- BONUS: ES6 REVIEW: JavaScript Sets05:27
In this lesson, we review JavaScript's Set object. The Set enforces uniqueness for the collection of values it stores.
- Intro to Getters10:53
In this lesson, we introduce Vuex getters. Getters are to a Vuex store what computed properties are to a component. Getters derive computed information from store state.
- Testing Getters06:47
In this lesson, we add tests for the new UNIQUE_ORGANIZATIONS getter.
- Wire Up UNIQUE_ORGANIZATIONS Getter in JobFiltersSidebarOrganizations04:54
In this lesson, we utilize the UNIQUE_ORGANIZATIONS getter in the JobFiltersSidebarOrganizations component. The getter creates a Set, then iterates over the jobs slice of Vuex store state, extracts each organization, and adds it to the set. The result is a unique collection of organizations.
- Use v-for to Render Unique Organizations in JobFiltersSidebarOrganizations05:20
In this lesson, we use the UNIQUE_ORGANIZATIONS getter to render a dynamic number of checkboxes in the JobFiltersSidebarOrganizations component.
- Testing Getters in JobFiltersSidebarOrganizations15:02
In this lesson, we add a test for the UNIQUE_ORGANIZATIONS getter inside the JobFiltersSidebarOrganizations component.
- The mapGetters Helper Function05:19
In this lesson, we introduce the mapGetters helper function from Vuex. It maps Vuex getters to computed properties on the component.
- Add v-model to Checkbox for Organizations07:37
In this lesson, we add a selectedOrganizations slice of data to hold the user's selected organizations.
- The v-on:change Handler07:14
In this lesson, we react to the user selecting a checkbox by using the v-on directive.
- TDD: Add selectedOrganizations Property to Vuex Store State08:42
In this lesson, we use TDD to add a selectedOrganizations property to our Vuex store state.
- TDD: Create ADD_SELECTED_ORGANIZATIONS Mutation08:14
In this lesson, we use TDD to wire up a ADD_SELECTED_ORGANIZATIONS mutation that updates the selectedOrganizations array.
- Commit Mutation to Receive Organizations from JobFiltersSidebarOrganizations Component06:29
In this lesson, we commit the ADD_SELECTED_ORGANIZATIONS mutation from the JobFiltersSiidebarOrganizations component whenever the user selects a checkbox.
- BONUS: REVIEW: filter Method on an Array07:56
In this lesson, we review the filter method on an array. It accepts a function and uses it to filter the elements from the original array into a new one.
- TDD: Adding Getter to Filter Jobs by Organization11:13
In this lesson, we use TDD to implement a FILTERED_JOBS_BY_ORGANIZATONS getter that filters our jobs to those with organizations that match the collection of selected organizations.
- Rendering Filtered Organization Jobs in JobListings Component11:37
In this lesson, we use the FILTERED_JOBS_BY_ORGANIZATIONS getter to render the filtered jobs. However, we run into a bug when the page loads!
- Fixing FILTERED_JOBS_BY_ORGANIZATIONS Getter Bug09:27
In this lesson, we fix the bug from the previous lesson by accounting for an empty selectedOrganizations array in the Vuex store state.
- Fixing Failing JobListings Tests13:16
In this lesson, we update our failing JobListings component tests to utilize mock getters. We replace our old test setup which relied on a store state.
- Adding Tests for JobFiltersSidebarOrganizations11:44
In this lesson, we add a test to confirm that JobFiltersSidebarOrganizations commits the right mutation when the user clicks a checkbox.
- Refactoring JobFiltersSidebarOrganizations Test03:07
In this lesson, we use factory functions to refactor our JobFiltersSidebarOrganizations tests.
- Displaying Accurate Number of Filtered Jobs13:53
In this lesson, we finally deal with an imperfection that's been in our app for a while. We render the correct number of filtered jobs in the Subnav component.
- Refactor our Vuex Store by Splitting it up Across Files07:54
In this lesson, we begin a refactor of our Vuex store by splitting its contents (constants, state, mutations, getters, and, actions) into separate files.
- Refactor our Vuex Test Suite04:44
In this lesson, we update the corresponding tests for the files we split in the previous lesson.
- Refactoring our Components03:14
In this lesson, we complete our refactor by updating component files that reference our Vuex store constants.
- Section Review05:41
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 2500:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:00
Welcome to the next user story! We'll allow the user to filters jobs by type. We'll have to support the existing logic for filtering by organization.
- TDD: Adding State for Job Types02:38
In this lesson, we use TDD to add a new selectedJobTypes property to Vuex store state.
- TDD: Adding Mutation for Selecting Job Types05:19
In this lesson, we use TDD to create a ADD_SELECTED_JOB_TYPES mutation. It will receive an array of job types from an eventual component and save it to the Vuex store state.
- TDD: Adding Getter for Unique Job Types08:30
In this lesson, we use TDD to add a new UNIQUE_JOB_TYPES getter.
- TDD: Adding Getter for Filtered Jobs by Job Types07:52
In this lesson, we use TDD to add a new getter for filtering jobs by job types.
- TDD: New JobFiltersSidebarJobTypes Component15:12
In this lesson, we use TDD to create a JobFiltersSidebarJobTypes component.
- Wire up Job Type Filters in Sidebar03:26
In this lesson, we add the new JobFiltersSidebarJobTypes component to our JobFiltersSidebar.
- Filter for Job Types in Job Listings04:04
In this lesson, we confirm that our new FILTERED_JOBS_BY_JOB_TYPES getter correctly filters jobs.
- Allow User to Apply Multiple Filters06:43
In this lesson, we write a new getter that allows the user to filter jobs by both organization and job types.
- Use New Getter in JobListings Component03:26
In this lesson, we attempt to add the FILTERED_JOBS getter to our JobFiltersSidebar component but discover that it doesn't work!
- Fixing New Bug07:39
In this lesson, we address the bug we discovered in our previous lesson by modifying our FILTERED_JOBS getter logic.
- Getters with Arguments14:20
In this lesson, we introduce the syntax for getters with arguments. We create two new getters to determine whether a single job should be included by its organization or job type.
- Tests for Getters with Arguments09:48
In this lesson, we add tests for the 2 new getters we created in the previous lesson.
- Applying our Changes to FILTERED_JOBS06:41
In this lesson, we utilize the two new getters in the FILTERED_JOBS getter.
- Fixing JobListings Tests03:36
In this lesson, we fix the failing tests for our JobListings component.
- TDD: Updating Subnav Tests and Implementation03:48
In this lesson, we update the tests for our Subnav component to utilize the FILTERED_JOBS getter.
- Delete Old Two Getters04:16
In this lesson, we perform some quick cleanup by removing the FILTERED_JOBS_BY getters.
- Adding Test for FILTERED_JOBS Getter11:07
In this lesson, we write an additional test for the FILTERED_JOBS getter.
- Fixing Extra Bug I14:03
In this lesson, we solve a visual user bug when the user filters for organizations/types on a later page of job results.
- Fixing Extra Bug II05:15
In this lesson, we complete solving the bug from the previous lesson.
- Section Review04:07
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 2600:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- What is reactivity?07:46
In this lesson, we reintroduce reactivity by exploring the concept in both Google Sheets and JavaScript.
- Vue’s ref Function08:50
In this lesson, we introduce Vue 3's new ref function. ref accepts an argument and wraps it in a reactive object with a value property.
- Vue’s computed Function07:32
In this lesson, we introduce Vue 3's new computed function. computed accepts a function that it re-executes whenever a referenced reactive value updates.
- One More Example with Another Primitive06:22
In this lesson, we provide another example of reactivity to reinforce the previous lessons' concepts.
- What about Object Reactivity?05:52
In this lesson, we try passing a JavaScript object to the ref function.
- Cleaning up the Code with reactive Function06:37
In this lesson, we introduce the reactive function, which is optimized to work with objects. JS objects support methods and properties, so the reactive function can utilize their existing plumbing. The advantage of reactive is that we do not need to use a value property.
- Multiple Properties on Reactive Object03:32
In this lesson, we practice creating reactive objects with multiple properties.
- Multiple Levels of Reactivity05:20
In this lesson, we combine multiple computed function calls to see how a reactive value change cascades through multiple evaluations.
- Destructuring Problems02:58
In this lesson, we discover an issue with reactivity when we destructure properties off a reactive object. The object is reactive (so it can track changes to itself) but an individual property is NOT reactive.
- The toRef Function05:02
In this lesson, we introduce the toRef function to solve the problem of the previous lesson. toRef accepts a reactive object and the name of the property to destructure and make reactive.
- The toRefs Function05:38
In this lesson, we introduce the toRefs function, a more convenient solution than multiple toRef calls. The toRefs function accepts a reactive object and returns an object where all properties are reactive.
- A Clarification on toRefs01:34
In this lesson, we clarify that the toRefs function can only accept a reactive object from Vue. We test what happens when we pass a plain object.
- Section Review06:29
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 2700:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Introduction to the Composition API09:30
In this lesson, we introduce Vue 3's Composition API and the problems with the Options API that it hopes to solve.
- The setup Method06:52
In this lesson, we start refactoring our Accordion component to use Vue 3's Composition API.
- The ref Function in setup Method08:15
In this lesson, we reintroduce the ref function from the previous lesson and use it in the setup method to create a reactive object. We also provide the object to the template.
- More Practice with ref04:54
In this lesson, we practice using the ref function to create reactive state that tracks whether the Accordion is open.
- The computed Function08:00
In this lesson, we use the computed function to watch the value of the isOpen reactive object and recalculate when it changes.
- Accepting Props in Component06:25
In this lesson, we reincorporate our commented-out props section back into the Accordion component.
- Checking in on Test Suite02:33
- Accepting Props in setup Method06:37
In this lesson, we start updating our ActionButton component to use the Composition API. We reveal that Vue provides a reactive props object as the first argument to the setup method. We use the props to generate a computed buttonClass for the button.
- Using toRefs on Props05:32
In this lesson, we use the toRefs function to create an object with reactive properties from the reactive props object. We then use it to customize the CSS class object we return in the ActionButton component.
- Section Review07:17
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 2800:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Composition API with v-model03:20
In this lesson, we start refactoring our JobSearchForm component to use Composition API. We start by replacing former data with new ref values.
- Composition API with Vue Router06:53
In this lesson, we use the useRouter function to replace this.$router in our Composition API.
- Fixing Failing JobSearchForm Tests07:19
In this lesson, we fix failing JobSearchForm tests by replacing the mocking of this.$router with the mocking of useRouter.
- Composition API with Vue Router Route04:54
In this lesson, we start refactoring the Subnav component to use the Composition API. We utilize the useRoute composable function from vue-router to replace the former reference to this.$route.
- Composition API with Vuex Getters07:15
In this lesson, we continue refactoring the Subnav component to use the Composition API. We utilize the useStore composable function from vuex to replace the former reference to this.$store.
- Fixing Failing Tests for Subnav06:20
Our Subnav tests are failing due to their reliance on this.$store and this.$route. We can now mock out the respective useStore and useRoute functions to get the tests passing.
- Building Composables10:37
In this lesson, we extract the logic for checking a route name to a new useConfirmRoute composable. We use familiar Vue 3 constructs like computed to enable reactivity.
- Testing Our useConfirmRoute Composable05:25
In this lesson, we write a test for our useConfirmRoute composable. We mock out the useRoute function from Vuex and test the return value.
- Simplifying Subnav Tests08:10
Our Subnav tests are utilizing our useRoute mock. For unit testing, this might be a step too far. In this lesson, we mock out our useConfirmRoute composable instead.
- Writing Composable for Getters10:12
In this lesson, we write a new useFilteredJobs composable function to access the FILTERED_JOBS getter on our Vuex store.
- Updating Subnav Tests07:57
In this lesson, we mock out the useFilteredJobs composable function in our Subnav tests.
- Adding More Composables for Getters09:09
In this lesson, we write two new composable functions to access getters on the Vuex store.
- Refactoring JobFiltersSidebarJobTypes03:17
In this lesson, we utilize the useUniqueJobTypes getter composable in our JobFiltersSidebarJobTypes component.
- Replacing mapMutations Function06:57
In this lesson, we discuss how to replace our former mapMutations code in JobFiltersSidebarJobTypes. The helper function can be replaced with a call to store.commit. We can access the store via the useStore composable from Vuex.
- Fixing Failing JobFiltersSidebarJobTypes Tests09:28
In this lesson, we fix failing tests for our JobFiltersSidebarJobTypes component. We mock out our useUniqueJobTypes, useStore, and useRouter composable functions with whatever individual tests require.
- Refactoring JobFiltersSidebarJobOrganizations Component06:53
In this lesson, we refactor our JobFiltersSidebarJobOrganizations component based on previously discussed Vue 3 principles.
- Fixing Failing Tests in JobFiltersSidebarOrganizations05:25
In this lesson, we fix the failing tests for JobFiltersSidebarOrganizations component by taking inspiration from JobFiltersSidebarJobTypes.
- Creating Reusable JobFiltersSidebarCheckboxGroup Component14:30
The JobFiltersSidebarJobOrganizations and JobFiltersSidebarJobTypes components are very similar, which is why the refactor process was nearly identical. Let's create a reusable JobFiltersSidebarCheckboxGroup component to replace them.
- Reuse JobFiltersSidebarCheckboxGroup15:31
In this lesson, we use the new JobFiltersSidebarCheckboxGroup to replace the former components in our JobFiltersSidebar.
- Adding Tests for JobFiltersSidebarCheckboxGroup10:10
In this lesson, we add a test suite for the JobFiltersSidebarCheckboxGroup component.
- Section Review05:10
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 2900:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- The onMounted Function08:00
In this lesson, we learn the Composition API's replacement for lifecycle hooks. Instead of defining methods, we import functions from vue and invoke them in the setup method.
- Refactoring JobListings Component to Use Composition API05:33
In this lesson, we start refactoring our JobListings component to utilize the Composition API. We start by replacing the mounted logic.
- Practice with Store Getters Again01:39
In this lesson, we reuse our useFilteredJobs getter to get access to the store's filtered jobs in our JobListings component. Composable functions are valuable because of their reusability.
- More Practice with computed Functions09:26
In this lesson, we continue replacing the old Options API implementation in the JobListings component. We use Vue'x computed function to generate the currentPage, previousPage, and nextPage values.
- Extracting Composables from JobListings I: useCurrentPage09:01
In this lesson, we extract the logic of figuring out the current page to a new useCurrentPage composable.
- Extracting Previous and Next Page Logic to Composable Function10:51
In this lesson, we move the logic of figuring out the previous and next page to a new composable. It returns an object of computed properties.
- Adding Tests for usePreviousAndNextPages Composable06:40
In this lesson, we add tests for the two composables we wrote in the previous lesson.
- Moving Dispatch out of JobListings07:13
In this lesson, we add a useFetchJobsDispatch composable that dispatches an action to the Vuex store.
- Fixing Failing Tests for JobListings Part I09:07
In this lesson, we start fixing the failing tests for the JobListings component. We import and mock out our composable functions, then fix the first test.
- Fixing Failing Tests for JobListings Part II09:56
In this lesson, we continue fixing failing tests. We also get to remove a few tests that are no longer needed.
- Fixing Failing Tests for JobListings Part III09:38
In this lesson, we finish fixing the failing tests for the JobListings component. We focus on the tests dealing with the Previous and Next page links.
- Updating JobListing Component03:40
In this lesson, we update the JobListing component to utilize the Composition API.
- Section Review03:52
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 3000:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Welcome to TypeScript08:43
Welcome to TypeScript! In this lesson, we introduce the programming language and the benefits it offers us as developers.
- Primitive Types08:16
In this lesson, we explore how to declare types for primitive values (strings, numbers, booleans, etc) in TypeScript.
- Type Inference04:06
In this lesson, we see how TypeScript auto-infers types based on initial assignments.
- The any type02:40
In this lesson, we introduce the any type, which tells TypeScript that a value can be of any type. We discuss the drawbacks of this type and the situations where we might use it.
- The unknown Type and Type Guards08:48
In this lesson, we show how the unknown type is a better choice than any because it forces us to write more careful code.
- Array Type Declarations04:45
In this lesson, we learn how to declare array types in TypeScript.
- Object Type Declarations07:31
In this lesson, we learn how to declare object types in TypeScript. We have to communicate both the object's properties and their types. Avoid the general object type as it is too broad.
- Type Literals04:22
In this lesson, we introduce type literals. A type literal is a type that represents a single value and nothing else.
- Type Literals and Objects04:58
In this lesson, we see how objects operate differently from primitives when it comes to type literals.
- Optional Properties04:43
In this lesson, we learn how to use the ? symbol to mark optional properties in TypeScript.
- Interfaces and Types08:21
In this lesson, we introduce interfaces, which allow us to create reusable object types.
- Declaring Types for Functions05:36
In this lesson, we learn how to add type annotations for functions in TypeScript.
- Interfaces for Functions06:00
In this lesson, we declare an interface to serve as the type for a function.
- Intro to Generics11:45
In this lesson, we introduce generics. A generic is a type argument. It adds flexibility to our type annotations by not locking down a specific type.
- Section Review07:00
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 3100:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Install TypeScript for Vue12:26
In this lesson, we use the Vue CLI to add TypeScript to our job search app. We also clean up some extra code that the process creates.
- Create Job Interface05:12
In this lesson, we define a Job interface that describes the shape of a sample Job object from the API.
- Define GlobalState Interface07:17
- Update State Test File to TypeScript02:54
In this lesson, we define a GlobalState interface that describes the shape of our Vuex store state.
- Update Constants File to TypeScript00:49
In this lesson, we convert our constants.js file to be a TypeScript file.
- Provide Types for All Mutations06:06
In this lesson, we update our mutations file to be in TypeScript. We utilize our GlobalState interface to describe the state flowing into every mutation method.
- Updating Mutations Test File I: First Solution05:45
In this lesson, we discuss how we can solve TypeScript's demands for complete GlobalState objects in our mutations tests.
- Updating Mutations Test File II: Second Solution06:20
In this lesson, we discuss an alternate solution for providing GlobalState objects in our Vuex mutations tests.
- TypeScript’s Partial Type06:17
In this lesson, we introduce TypeScript's Partial type. Partial accepts an interface and returns a new interface where all original properties are optional.
- Creating a Store Factory Function06:22
In this lesson, we add a createState factory function to get ideal setup in our mutations tests.
- Updating Mutations Test: Our Next Problem07:41
In this lesson, we add a createJob factory function to create sample job objects for our mutations tests.
- Fixing Remaining Mutations Tests03:04
Now that we've figured out great solutions to generating valid state and Job objects, we fix the remaining tests for our mutations.
- Adding Types to Getters File I07:30
In this lesson, we start converting our getters file to TypeScript.
- Adding Types to Getters File II07:23
In this lesson, we complete converting our getters file to TypeScript. We also discuss an interesting issue around adding types for our getters (second argument to a getter method).
- Create Utils File for Factory Functions05:20
In this lesson, we create a new utils.ts file to store our createJob and createState factory functions.
- Updating Getters Test File07:02
In this lesson, we update our getters test file to use our helper functions.
- Updating Vuex Actions05:10
In this lesson, we update our Vuex actions file to use TypeScrpt.
- Mocking API Calls with TypeScript06:49
In this lesson, we discuss how to reconcile issues between Jest and TypeScript. TS does not understand that jest.mock replaces the implementation of an object, so we have to explicitly cast our mock to jest.Mock.
- Adding Types to Vuex Composables08:05
In this lesson, we update our Vuex store composables to utilize TypeScript.
- Updating Composables Tests02:37
Now that we've updated our composables to TypeScript, we update the corresponding test file.
- Adding Types to Index File02:12
One more Vuex file to go! In this lesson, we update our src/store/index file to TypeScript.
- Section Review06:10
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 3200:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- Adding Type Annotations to ProfileImage Component08:43
- Adding Type Annotations to MainNav Component08:18
In this lesson, we add TypeScript to the MainNav component.
- Adding Type Annotations to Headline Component14:02
In this lesson, we add TypeScript to the Headline component.
- Using TypeScript with Composition API (Accordion Component)03:21
In this lesson, we add TypeScript to the Accordion component. This is our first opportunity to use TypeScript in a Composition API component.
- Adding Type Annotations to ActionButton Component05:20
In this lesson, we add TypeScript to the ActionButton component.
- Annotating Event Handlers09:15
In this lesson, we discuss how to annotate Event objects from user events with TypeScript.
- Adding Type Annotations to HeaderContainer Component01:39
In this lesson, we add TypeScript to the HeaderContainer component.
- Adding Type Annotations to Subnav Component02:19
In this lesson, we add TypeScript to the Subnav component.
- Adding Types to Composables I07:25
In this lesson, we add TypeScript to our composable functions, starting with useConfirmRoute and useCurrentPage.
- Adding Types to Composables II04:30
In this lesson, we add TypeScript to our final composable function, usePreviousAndNextPages.
- Annotating Axios Requests (Spotlight Component)06:16
In this lesson, we add TypeScript to the Spotlight component.
- Annotating getJobs API Function04:35
In this lesson, we add TypeScript to the getJobs API call.
- Adding Type Annotations to JobListing Component10:29
In this lesson, we add TypeScript to the JobListing component.
- Adding Type Annotations to JobListings Component05:36
In this lesson, we add TypeScript to the JobListings component.
- Adding Type Annotations to JobFiltersSidebar Component01:05
In this lesson, we add TypeScript to the JobFiltersSidebar component.
- Writing Tests for JobFiltersSidebar Component14:08
In this lesson, we add a new test suite for our JobFiltersSidebar component.
- Adding Type Annotations to JobFiltersSidebarCheckboxGroup Component03:11
In this lesson, we add TypeScript to the JobFiltersSidebarCheckboxGroup component.
- Annotating Store for useStore in Component11:59
In this lesson, we add TypeScript support for our Vuex store inside components. The process involves defining a key that we hook up to the store. We also have to import the key and pass it to the useStore composable wherever we use it.
- Updating Tests for JobFiltersSidebarCheckboxGroup Component04:19
- Adding Type Annotations to JobSearchForm Component02:39
In this lesson, we add TypeScript to the tests for the JobSearchForm component.
- Adding Types for Utility Functions05:58
In this lesson, we add TypeScript to our nextElementInList helper function.
- Adding Type Annotations to Hero and App Components01:36
In this lesson, we add TypeScript to the Hero and App components.
- Annotating Our Views02:34
In this lesson, we add TypeScript to our page views.
- Updating Composables to use Store Key01:31
In this lesson, we update our composable functions (for getters and actions) to pass in the key to the useStore function call.
- Updating Router File01:40
In this lesson, we update our router/index file to TypeScript. This completes our goal of moving the entire codebase to TypeScript.
- Section Review08:18
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 3300:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- User Story01:23
Welcome to our next user story! We'll be allowing the user to filter jobs by degree/educational requirements.
- JSON Content for db.json File00:10
In this lesson, we download the code we need to add to db.json to create a new endpoint in the previous lesson.
- Adding /degrees Endpoint03:23
In this lesson, we add a new degrees endpoint to our db.json configuration file for JSON server. We'll be hitting this endpoint for the unique degrees that the user will be able to filter by.
- TDD for API Call: getDegrees API Call06:32
In this lesson, we use TDD to create a new getDegrees function that fetches our array of degrees.
- TDD for State: Starting State for Degrees05:44
In this lesson, we use TDD to add a new degrees property to the Vuex store state.
- TDD for Mutations: RECEIVE_DEGREES09:50
In this lesson, we use TDD to add a new RECEIVE_DEGREES mutation to the Vuex store.
- TDD for Actions: FETCH DEGREES07:11
In this lesson, we use TDD to add a new FETCH_DEGREES action to the Vuex store.
- TDD for Getters: UNIQUE_DEGREES07:12
In this lesson, we use TDD to add a new UNIQUE_DEGREES getter to the Vuex store.
- TDD for State: selectedDegrees03:08
In this lesson, we use TDD to add a new selectedDegrees property to the Vuex store state.
- TDD for Getters: INCLUDE_JOB_BY_DEGREE09:51
In this lesson, we use TDD to add a new INCLUDE_JOB_BY_DEGREE getter to the Vuex store.
- TDD for Getters: FILTERED_JOBS07:26
In this lesson, we use TDD to update the FILTERED_JOBS getter in the Vuex store.
- TDD for Mutations: ADD_SELECTED_DEGREES06:38
In this lesson, we use TDD to add a new ADD_SELECTED_DEGREES mutation to the Vuex store.
- TDD for Composables: useUniqueDegrees07:40
In this lesson, we use TDD to add a new useUniqueDegrees composable function.
- TDD for Component: JobFiltersSidebar13:27
In this lesson, we use TDD to add a new section to the JobFiltersSidebar that allows the user to filter by degrees.
- TDD for Composable: useFetchDegreesDispatch07:39
In this lesson, we use TDD to create a new useFetchDegreesDispatch composable function.
- TDD for Lifecycle Hook: onMounted05:09
In this lesson, we use TDD to make the request for degrees from our JobListings component.
- Trying Out Code in Browser04:19
In this lesson, we explore and test our latest feature in our web browser.
- Section Review04:07
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 3400:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- User Story01:18
Welcome to our next user story! We'll allow the user to create a search from scratch by clearing all existing filters.
- TDD for CLEAR_USER_JOB_FILTER_SELECTIONS Mutation07:21
In this lesson, we use TDD to write a CLEAR_USER_JOB_FILTER_SELECTIONS mutation. Its responsibility will be to clear all 3 selected arrays in the Vuex store state.
- Wiring up Click Handler In JobFiltersSidebar06:37
In this lesson, we use the v-on directive to handle a user click in our JobFiltersSidebar component. The corresponding function commits the mutation that we wrote in the previous lesson.
- The subscribe Method on a Store09:55
In this lesson, we introduce the subscribe method on the Vuex store. It enables a component to react to Vuex mutations. We use it to update the local selectedValues state in our JobFiltersSidebarCheckboxGroup component.
- Fixing Failing Tests in JobFiltersSidebarCheckboxGroup Component06:11
Our mock store now needs to support a subscribe method. In this lesson, we update the JobFiltersSidebarCheckboxGroup tests to account for the code change.
- Refactoring the Accordion Component09:54
In this lesson, we move the <accordion> component render up one level to the JobFiltersSidebar component. This allows us to simplify the implementation and tests for the JobFiltersSidebarCheckboxGroup component.
- Breaking JobFiltersSidebar Into Smaller Components17:11
Let's simplify our JobFiltersSidebar component and its associated tests. We'll start by breaking up the CheckboxGroup renders into smaller component. Each component will worry about only one composable and mutation.
- Breaking up Former JobFiltersSidebar Component Tests20:25
Now that we have smaller components, let's move the former tests for the JobFiltersSidebar component into new test files.
- Creating JobFiltersSidebarPrompt Component07:18
To simplify the JobFiltersSidebar component even further, we extract another section of it into a new JobFiltersSidebarPrompt component.
- Adding Tests for JobFiltersSidebarPrompt Component06:06
Let's add some tests for our newly added JobFiltersSidebarPrompt component.
- Section Review02:32
In this lesson, we review everything we've learned in this course section.
- Code at End of Section 3500:25
Download the project code as it stands at the end of this section. This can be helpful if you'd like to pick up the course at a specific section.
- User Story02:57
One more user story! In this section, we'll be adding a text-based skills input that the user can use to filter jobs.
- Create Component to Track Skills and Qualifications04:51
In this lesson, we create and style a new JobFiltersSidebarSkills component. We also render it inside our JobFiltersSidebar component.
- Add New Search Term to Vuex State03:38
In this lesson, we add a skillsSearchTerm property to our Vuex store state.
- Add Mutation to Update Skills Search Term04:38
In this lesson, we add a UPDATE_SKILLS_SEARCH_TERM mutation to update the skillsSearchTerm property on our Vuex store state.
- Filtering the Jobs by Search Term06:18
In this lesson, we write a new INCLUDE_JOB_BY_SKILL helper getter to determine if a job should be included based on the user's search term being in the job's title.
- Two More Tests for INCLUDE_JOB_BY_SKILL05:54
In this lesson, we wire up some additional tests for the new INCLUDE_JOB_BY_SKILL getter.
- Wiring up Search State to Vuex Store15:31
In this lesson, we introduce a new get/set syntax for the computed function. This solution allows us to connect local component state to the Vuex store.
- The lazy Input Modifier05:45
In this lesson, we introduce the lazy input modifier for a text input. It waits until the user stops typing to invoke its action method.
- The trim Input Modifier03:11
In this lesson, we introduce the trim input modifier for a text input. It removes leading and trailing whitespace from the user's entry.
- Adding Test for Reading from Store to Skills07:59
In this lesson, we write a new test to validate reading from the Vuex store in the JobFiltersSidebarSkills component.
- Adding Test for Writing to Store from Skills04:00
In this lesson, we write a new test to validate writing to the Vuex store in the JobFiltersSidebarSkills component.
- Adding Test for Trimming Input02:38
In this lesson, we add a supplemental test for trimming whitespace in the JobFiltersSidebarSkills component.
- Updating the FILTERED_JOBS Getter05:39
Let's bring all the pieces together! In this lesson, we use our new INCLUDE_JOB_BY_SKILL getter in the composite FILTERED_JOBS getter.
- Clearing the Search Input when Clearing Filters03:42
In this lesson, we clear the search input whenever the user clicks the Clear Filters button on the job filters sidebar.
- Reading Search Term from Query Params10:26
In this lesson, we finally capture the user's search criteria from the home page on the job results page.
- Fixing Failing Tests for JobFiltersSidebar Component05:09
In this lesson, we update some failing tests for our JobFiltersSidebar component.
- Section Review04:32
In this lesson, we review everything we've learned in this course section.
JOIN OUR WHATSAPP GROUP TO GET LATEST COUPON AS SOON AS UPDATED
JOIN WHATSAPPJOIN OUR TELEGRAM CHANNEL TO GET LATEST COUPON
JOIN TELEGRAMJOIN OUR FACEBOOK GROUP TO GET LATEST COUPON
JOIN FACEBOOKFree Online Tools And Converters for your use
URL Encoder
Input a string of text or a URL and encode the entered string
Try itURL Decoder
Input an encoded string of text or a URL and decode the entered string
Try itColor Contrast Checker (WCAG)
Calculate the color contrast ration for your website (WCAG)
Try itXML Formatter
Paste or upload an XML and have it formatted to a beautiful XML format
Try itURL Slug Generator
Convert any title or sentence into a variety of slugs for your pages URL
Try itE-Signature
Draw an e-signature or type a signature for your online signature
Try it