93

I am using react. I want to add a line break <br> between strings

'No results' and 'Please try another search term.'.

I have tried 'No results.<br>Please try another search term.'

but it does not work, I need to add the <br> in the html.

Any ideas how to solve it?

   render() {
       let data = this.props.data;
       let isLoading = this.props.isLoading;
       let isDataEmpty = Object.entries(data).length === 0;
       let movieList = isLoading ? <Loader /> : isDataEmpty ? 'No results. Please try another search term.' :
           Object.entries(data).map((movie, index) => <MovieTile key={index} {...movie[1]} />);
       return (
           <div className='movieList'>{movieList}</div>
       );
   }

0

13 Answers 13

107

You should use JSX instead of string:

<div>No results.<br />Please try another search term.</div>

Because each jsx should have 1 wrapper I added a <div> wrapper for the string.

Here it is in your code:

render() {
   let data = this.props.data;
   let isLoading = this.props.isLoading;
   let isDataEmpty = Object.entries(data).length === 0;
   let movieList = isLoading ? <Loader /> : isDataEmpty ? <div>No results.<br />Please try another search term.</div> :
       Object.entries(data).map((movie, index) => <MovieTile key={index} {...movie[1]} />);
   return (
       <div className='movieList'>{movieList}</div>
   );
}
Sign up to request clarification or add additional context in comments.

6 Comments

?? Does not work for me. in the return method of render, i have<div> {this.state.myErrorString}</div>, where myErrorString itself begins with a <div> and ends with a </div> and has <br/> inside it, and all the tags displays !
@joedotnot does myErrorString is a string or a jsx object?
It is a string; For example: this.setState({myErrorString : "<div>it is a string.<br/>continue here</div>"}) which I then render inside jsx; For example: render() { return <div>{this.state.myErrorString}</div> }
It looks like let movieList = a jsx object ! So how do i transition from a string in state into a jsx object?
This is a complete different question. Why are you using a string on the first place instead of a jsx object?
|
90

You can use CSS white-space to solve the problem.

React Component

render() {
   message = `No results. \n Please try another search term.`;
   return (
       <div className='new-line'>{message}</div>
   );
}

CSS

.new-line {
  white-space: pre-line;
}

OUTPUT

No results.
Please try another search term.

6 Comments

The best way to fix!
This should be the one and only and accepted answer
new to react, so my line of thinking is: how would i add a line break in pure html? then why do i have to create this contrived class to add a new line in react?
Nice one! I recommend this method.
@Nilesh there's no need to add a line break tag in HTML when CSS can simply show the literal line breaks in the content. In React, all text content is sanitized, so it's more difficult to output text (from a source you don't control) with HTML line breaks unless you do some Javascript parsing (overkill for a small problem) or you use dangerouslySetInnerHTML (dangerous with user input).
|
19

break text to line:

render() {
  ...
  <div>
    {this.props.data.split('\n').map( (it, i) => <div key={'x'+i}>{it}</div> )}
  </div>
  ...

Comments

16

Some HTML elements such as <img> and <input> use only one tag. Such tags that belong to a single-tag element aren't an opening tag nor a closing tag. Those are self-closing tags.

In JSX, one has to include the slash. So, remove <br> and try <br />

Comments

12

Here is how I got around this. Let message be the prop/variable that has the string containing line breaks to be displayed in HTML as follows:

message = 'No results.<br>Please try another search term.';
<div>
  {message}
</div>

To make this work, we need to use \n instead of break tag <br> and set the following css on the wrapper element of this message as follows:

message = 'No results.\nPlease try another search term.';
<div className="msg-wrapper">
  {message}
</div>

CSS:

.msg-wrapper {
  white-space: pre-wrap;
}

OUTPUT:

No results.
Please try another search term.

Comments

4

If you don't want put the string inside a <div> you could use <> to do it.

Like this:

var text = <>This is a text in the first line;<br />this is a text in a second line</>;

1 Comment

I wanted my code directly inline but the React.Fragment was the way to do it.
3

Just split text by /n, I do this in this way:

<div>
    {text.split('\n').map((item, i) => <p key={i}>{item}</p>)}
</div>

Comments

1

Try with span

return (
           <div className='movieList'><span>{movieList}</span></div>
       );

Comments

1

If you are like in my situation and you don't want to add css, you can do that :

render () {
...
return (
...
<Typography component="p">
...
{(contact.lastname)?<div>Hello {contact.firstname} {contact.lastname}</div>:''}
...
</Typography>
...
);
}

Comments

0

using `
worked for me however i am not sure if it is the exact solution to the problem :

 import React from 'react';
import ReactDOM from 'react-dom';

let element = (
<div>
  <h1> Hello world</h1>
  This is just a sentence <br></br>
  But This line  should not be in the same previous line. <br></br>
  The above content proves its working. <br></br>
  npm v6.14.6 | react : {React.version} 
</div>
);

ReactDOM.render(element,document.getElementById("html-element-id"))

Comments

0

You can add a span tag and add block as a class.

Pomodoro Technique Timer <span className="block">with Bla</span>

Comments

0

The simplest thing which I did is by creating a component.

const EmptySpace = ({ spaceCount = 0 }) => {
  return (
    <>
      {Array.from({ length: spaceCount }, (item, index) => {
        return <br key={index} />;
      })}
    </>
  );
};

export default EmptySpace;
<EmptySpace spaceCount={1} />

In your case you could do something like this:

const msg = (
    <p>
      No results <EmptySpace spaceCount={2} />
      Please try another search term.
    </p>
  );

Comments

0

can pass the content as an array ref: https://reactjs.org/docs/jsx-in-depth.html

Page

import MyComponent from './components/myComponent';

export default function Page() {
  return(
        <div>
            <MyComponent
              content= {["Line 1", <br/>,  "Line 2", <br/>, "Line 3"]}
            />
        </div>
  )
}

React Component

export default function MyComponent(props) {
  return (
    <p>
        {props.content}
    </p>
  )
}

OUTPUT

Line 1
Line 2
Line 3

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.