Thanks to visit codestin.com
Credit goes to www.scribd.com

0% found this document useful (0 votes)
3 views14 pages

Module 3 Answer

To build a simple Issue Tracker in React, key components include IssueList for managing issues, IssueTable for displaying them, IssueRow for individual issue representation, IssueAdd for adding new issues, and IssueFilter for filtering the list. The document also discusses React lifecycle methods like componentDidMount() for data loading, component composition for UI building, and the differences between functional and class components. Additionally, it covers form validation techniques and outlines how to deploy a simple Hello World function using serverless platforms like AWS Lambda and Vercel.

Uploaded by

sarbjotsingh1804
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views14 pages

Module 3 Answer

To build a simple Issue Tracker in React, key components include IssueList for managing issues, IssueTable for displaying them, IssueRow for individual issue representation, IssueAdd for adding new issues, and IssueFilter for filtering the list. The document also discusses React lifecycle methods like componentDidMount() for data loading, component composition for UI building, and the differences between functional and class components. Additionally, it covers form validation techniques and outlines how to deploy a simple Hello World function using serverless platforms like AWS Lambda and Vercel.

Uploaded by

sarbjotsingh1804
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 14

Ques: Describe how you would build a simple Issue Tracker

in React. What key components would you need?


To build a simple Issue Tracker in React, you would need several
key components, as described in the provided content:

1. **Core Components**:

* **IssueList**: This component displays the list of issues.


It manages the state of the issues and can include methods for
loading and creating issues. The `IssueList` component serves as
the least common ancestor for state management.
* **IssueTable**: This component presents the issues in a
tabular format. It receives the list of issues as props from
`IssueList` and renders each issue using `IssueRow`.
* **IssueRow**: This component represents a single issue
in a row within the `IssueTable`. It receives issue data as props
and displays the issue's attributes.
* **IssueAdd**: This component provides a form for adding
new issues. It includes fields for the issue's attributes and a
mechanism to submit the new issue to the `IssueList` for
creation. It uses a callback to add a new array element in
`IssueList`'s state.
* **IssueFilter**: This component allows users to filter the
list of issues based on various parameters.

2. **Component Structure and Data Flow**:

* The main page of the Issue Tracker will have three parts: a
filter, a list of issues, and an entry form for adding a new issue.
* The structure and hierarchy of the user interface involve
composing components like `IssueFilter`, `IssueTable`, and
`IssueAdd` within the `IssueList` component.
* Data flows from the state in `IssueList` down to the child
components (`IssueTable`, `IssueRow`) as props. Events in the
child components that affect the parent's state call methods
defined in the parent, which are passed down as callbacks via
props.

3. **State Management**:

* The `IssueList` component holds the state, which is an array


of issues (`this.state.issues`).
* The state is initialized in the constructor of the `IssueList`
component.
* Methods like `loadData()` and `createIssue()` are used to
manage and update the state.

4. **Key Considerations**:

* **Component Composition**: Larger components should


be split into smaller, fine-grained components for logical
separation and reusability.
* **Stateless Components**: Components like `IssueRow`
and `IssueTable` can be implemented as stateless functions that
depend only on props for rendering.
* **One-Way Data Flow**: Data flows down from parent to
children as props, and events trigger state changes in the parent,
which then flow back down as props.
* **State vs. Props**: Props are immutable, while state is
mutable. State variables are passed down to child components as
props.

By building these components and managing the data flow and


state effectively, you can create a functional Issue Tracker
application using React.
Ques: Explain the lifecycle methods in React class
components. Provide an example of componentDidMount().

React class components have lifecycle methods that provide


hooks into various stages of component formation and other
events. These methods allow you to perform actions at specific
points in a component's lifecycle, such as when it's being created,
updated, or unmounted.

Here are some key lifecycle methods:

* **componentDidMount()**: This method is called as soon as


the component's representation has been converted and inserted
into the DOM. It is a good place to initiate loading data and call
`setState()` to re-render the component. The DOM is guaranteed
to be ready at this point.

* **componentDidUpdate()**: This method is invoked


immediately after an update occurs, but not for the initial render.
You can call `this.setState()` within this method. It receives the
previous props and previous state as arguments, allowing you to
compare the differences before taking action.

* **componentWillUnmount()**: This method is useful for


cleanup, such as canceling timers and pending network requests.

* **shouldComponentUpdate()**: This method can be used to


optimize and prevent a re-render if a change in props or state
doesn't affect the output or view. It is rarely used when state and
props are well-designed.
**Example of `componentDidMount()`**:

```jsx
class IssueTable extends React.Component {
constructor() {
super();
this.state = { issues: [] };
}

componentDidMount() {
this.loadData();
}

loadData() {
setTimeout(() => {
this.setState({ issues: initialIssues });
}, 500);
}
}
```

In this `IssueTable` example, `componentDidMount()` is used to


call the `loadData()` method once the component has been
mounted. The `loadData()` method simulates an asynchronous
API call using `setTimeout()` and then updates the component's
state with an array of issues. This causes the component to re-
render with the fetched data.

Ques. What is component composition in React, and why is


it useful? Provide an example where a Card component is
composed of Header, Body and Footer?
Component composition in React is a powerful feature that
allows you to build UIs by combining smaller, independent
components. It involves creating components that use other user-
defined components as well as built-in React components (which
are HTML element equivalents).

**Why is it useful?**

* **Splitting the UI**: It enables you to divide the UI into


smaller, independent pieces. Each piece can be coded and
reasoned about in isolation, which makes it easier to build and
understand a complex UI.
* **Encourages Reuse**: Using components promotes reuse.
A component can be reused even if its reuse wasn't initially
planned during its creation.
* **Logical Separation**: Larger components can be split into
fine-grained components when there is a logical separation
possible between them.
* **Minimal Coupling**: It helps to keep coupling between
components to a minimum.

**Example:**

Here’s how you might compose a `Card` component from


`Header`, `Body`, and `Footer` components:

```jsx
class Header extends React.Component {
render() {
return (

{this.props.title}
);
}
}

class Body extends React.Component {


render() {
return (

{this.props.content}

);
}
}

class Footer extends React.Component {


render() {
return (

{this.props.children}

);
}
}

class Card extends React.Component {


render() {
return (

<Header title={this.props.title} />


<Body content={this.props.content} />
<Footer>{this.props.footer}</Footer>

);
}
}

// Usage
const element = (
<Card
title="My Card"
content="This is the card content."
footer="Card footer information"
/>
);

ReactDOM.render(element, document.getElementById('root'));
```

In this example, the `Card` component is composed of `Header`,


`Body`, and `Footer` components. Each of these sub-
components is responsible for rendering a specific part of the
card. The `Card` component takes `title`, `content`, and `footer`
as props and passes them down to the relevant child components.
This illustrates how component composition can be used to build
complex UIs from smaller, reusable pieces.

Ques. What is the difference between a functional component


and a class component in React?

Based on the provided content, here's a breakdown of the


differences between functional and class components in React:

* **Stateless vs. Stateful:** Class components can have state


and lifecycle methods, while functional components (before
hooks) were primarily stateless and received data as props.
Functional components are like pure functions, taking props and
rendering a view based on them.
* **Syntax:** Class components are created using ES2015
classes that extend `React.Component` and must have a
`render()` method. Functional components are JavaScript
functions that can be written more concisely, especially when the
rendered output is a single JavaScript expression. They can also
be written using arrow functions.
* **Lifecycle methods:** Class components can use lifecycle
methods like `componentDidMount`, `componentDidUpdate`,
and `componentWillUnmount`. Functional components (before
hooks) did not have direct access to lifecycle methods.
* **State Management:** Class components manage state
using `this.state` and `this.setState()`. Functional components
(before hooks) didn't have built-in state management
capabilities.

In essence, React recommends writing stateless components as


functions for performance and code clarity. `IssueRow` and
`IssueTable` are good examples of components that can be
effectively implemented as stateless functional components.

Ques: What is form validation in Javascript and how can you


prevent form submission if the input is invalid?

Form validation in JavaScript involves verifying that the data


entered by a user in a form meets certain criteria before it is
submitted . This ensures data accuracy and integrity.

Here’s how you can prevent form submission if the input is


invalid:
1. **Using `preventDefault()`**: Within the `handleSubmit()`
method, you can use `e.preventDefault()` to prevent the default
form submission behavior when the Add button is clicked. This
allows you to handle the form submission manually in
JavaScript.

2. **Conditional Validation and Submission**: You can


implement validation logic within the `handleSubmit` function.
If the validation fails (i.e., there are invalid fields), you can
prevent the form from submitting.

```javascript
handleSubmit(e) {
e.preventDefault();
const form = document.forms.issueAdd;
const issue = {
owner: form.owner.value,
title: form.title.value,
status: 'New',
};

if (this.isValidInput(issue)) {
this.props.createIssue(issue);
form.owner.value = "";
form.title.value = "";
} else {
// Display an error message or take other actions to prevent
submission
console.log("Invalid input. Please correct the form.");
}
}
```
3. **Tracking Validity**: Use a state variable to track the
validity status of each input field. For example, an object called
`invalidFields` can store an entry for every invalid field, set to
`true`. If a field is valid, the property is deleted from the
`invalidFields` object. Before submitting the form, check if the
`invalidFields` object has any entries.

```javascript
if (Object.keys(invalidFields).length !== 0) {
validationMessage = (
<div className="error">
Please correct invalid fields before submitting.
</div>
);
}
```

4. **Displaying Error Messages**: Display error messages to


inform the user about the invalid fields. This can be done
conditionally based on the validation status of the input fields.
The error messages can be styled to stand out, for example, using
a red border or font color.

5. **Using the `required` attribute**: The `required` attribute in


HTML can be used to ensure that certain fields are filled out
before the form is submitted.

6. **Real-time Validation**: For numeric inputs, validate on


every change to prevent non-numeric characters from being
entered . Use regular expressions to test the input and only update
the state if the input is valid.
7. **Disabling Submit Button**: Conditionally disable the
submit button based on form validity.

8. **Alerts**: Display styled alerts, like those provided by


React-Bootstrap, to indicate validation errors after the user
attempts to submit the form. The visibility of these alerts can be
controlled by a state variable and dismissed by the user.

Ques: Develop a “Serverless “application, and how can you


deploy a simple Hello World function using a serverless
platform like AWS Lambda or Vercel?

AI: The provided text describes a "Server-Less Hello World"


application using React, Node.js, and Express, but it doesn't use
a serverless platform like AWS Lambda or Vercel directly.
However, the text does explain how to deploy a React application
to Heroku, which is a Platform-as-a-Service (PaaS) option.

Here's a conceptual outline of how you could deploy a simple


"Hello World" function using a serverless platform, based on
general knowledge of serverless deployment:

**Using AWS Lambda:**

1. **Write the Lambda function:**


* Create a Node.js function that takes an event and context
as arguments and returns a "Hello World" message.

```javascript
exports.handler = async (event) => {
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
```

2. **Create a Lambda function using the AWS Management


Console or AWS CLI:**
* Specify the function name, runtime (Node.js), and
execution role.
* Upload the function code as a ZIP file or directly edit it in
the console.

3. **Configure an API Gateway trigger:**


* Create an API Gateway endpoint that triggers the Lambda
function.
* Define the HTTP method (e.g., GET) and the path for the
endpoint.

4. **Deploy the API Gateway:**


* Deploy the API to make the endpoint publicly accessible.

5. **Test the function:**


* Invoke the API Gateway endpoint using a web browser or
a tool like `curl`.

**Using Vercel:**

1. **Create a Node.js function:**


* Create a file named `api/hello.js` (or similar) with the
following code:

```javascript
module.exports = (req, res) => {
res.status(200).send('Hello from Vercel!');
};
```

2. **Create a `vercel.json` file (optional):**


* This file allows you to configure routes, headers, and other
settings.

```json
{
"routes": [
{ "src": "/api/hello", "dest": "/api/hello.js" }
]
}
```

3. **Deploy to Vercel:**
* Install the Vercel CLI: `npm install -g vercel`
* Run `vercel` in your project directory.
* Vercel will automatically detect the Node.js function and
deploy it.

4. **Test the function:**


* Vercel provides a unique URL for your deployment. Access
the `/api/hello` endpoint to test the function.

**Key differences highlighted in the provided text:**

* The "Server-Less Hello World" example in the book uses


React to render content on the browser without direct server
interaction initially.
* Later, the book uses Node.js and Express to serve static files,
including the React application.
* The book then details how to deploy the application to
Heroku, a PaaS.
* The book does not provide direction for using AWS Lambda
or Vercel.

You might also like