DEV Community

Alireza Razinejad
Alireza Razinejad

Posted on

3

Demystifying MVC Architecture in Modern Web Frameworks: React and Angular

As web development evolves, so do the architectural patterns we use. While MVC (Model-View-Controller) is a staple in software design, adapting it to frameworks like React and Angular can optimize our projects for better scalability and maintainability. Here’s a quick guide on how you can implement MVC-like structures in both frameworks:

React and MVC:

React is predominantly view-oriented, focusing on UI components. However, incorporating Redux allows us to neatly separate concerns:

Model: Redux Store manages application state, acting as a single source of truth.

// Redux store (model.js)
import { createStore } from 'redux';

const initialState = {
    counter: 0
};

function reducer(state = initialState, action) {
    switch (action.type) {
        case 'INCREMENT':
            return { ...state, counter: state.counter + 1 };
        case 'DECREMENT':
            return { ...state, counter: state.counter - 1 };
        default:
            return state;
    }
}

const store = createStore(reducer);
export default store;
Enter fullscreen mode Exit fullscreen mode

View and Controller: React components render UI and handle user interactions, dispatching actions to update the model.

// Counter.js (React component)
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';

const Counter = () => {
    const counter = useSelector(state => state.counter);
    const dispatch = useDispatch();

    return (
        <div>
            <h1>Counter: {counter}</h1>
            <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
            <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
        </div>
    );
}

export default Counter;
Enter fullscreen mode Exit fullscreen mode

Angular Embraces MVC Naturally:

Angular’s robust structure supports MVC more directly with its component and service architecture:

Model: Services in Angular manage data logic and state, similar to traditional MVC models.

// counter.service.ts
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class CounterService {
  private counter = new BehaviorSubject<number>(0);

  getCounter() {
    return this.counter.asObservable();
  }

  incrementCounter() {
    this.counter.next(this.counter.value + 1);
  }

  decrementCounter() {
    this.counter.next(this.counter.value - 1);
  }
}
Enter fullscreen mode Exit fullscreen mode

View: Templates render the UI, binding directly to the component class.

<!-- counter.component.html -->
<div>
  <h1>Counter: {{ counter | async }}</h1>
  <button (click)="increment()">Increment</button>
  <button (click)="decrement()">Decrement</button>
</div>
Enter fullscreen mode Exit fullscreen mode

Controller: Angular components handle data and user interactions, communicating with services.

// counter.component.ts
import { Component } from '@angular/core';
import { CounterService } from './counter.service';

@Component({
  selector: 'app-counter',
  templateUrl: './counter.component.html'
})
export class CounterComponent {
  counter = this.counterService.getCounter();

  constructor(private counterService: CounterService) {}

  increment() {
    this.counterService.incrementCounter();
  }

  decrement() {
    this.counterService.decrementCounter();
  }
}
Enter fullscreen mode Exit fullscreen mode

Both React and Angular offer unique takes on MVC, adapting its core principles to the component-driven development landscape. By understanding these patterns, developers can create more organized and manageable codebases.

👉 If you're looking to deepen your understanding or considering integrating MVC into your projects, let's connect and discuss how these patterns can be tailored to fit your needs!

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more